Skip to content

Factory registration

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

Resolver factory

You can also register a service with a factory delegate which gets the current lifetime 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.

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());