Skip to content

Factory registration

Peter Csajtai edited this page May 21, 2019 · 12 revisions

You can register a Func<> delegate as a service factory:

container.RegisterFunc<IDrow>(resolver => new Drizzt(resolver.Resolve<IWeapon>()));

Then you can access the registered factory by requesting a Func<> type:

var factory = container.Resolve<Func<IDrow>>();
var drizzt = factory();

Custom parameters

You can also register factory delegates with custom parameters:

container.RegisterFunc<IWeapon, IWeapon, IDrow>(
    (leftHand, rightHand, resolver) => new Drizzt(leftHand, rightHand));

//then request the factory
var factory = container.Resolve<Func<IWeapon, IWeapon, IDrow>>();
var drizzt = factory(new Icingdeath(), new Twinkle());

Resolver factory

You have the option to register a factory delegate which will be used to instantiate your service. This delegate gets the current resolution scope as an argument.

container.Register<IDrow, Drizzt>(context => context.
    WithFactory(resolver => 
        new Drizzt(resolver.Resolve<IWeapon>("Twinkle"), resolver.Resolve<IWeapon>("Icingdeath")));

container.Resolve<IDrow>(); //the container will use the given factory to instantiate Drizzt.