inversion of control - Autofac named registration constructor injection -
does autofac support specifying registration name in components' constructors?
example: ninject's namedattribute.
you need use autofac.extras.attributed package on top achieve this
so let's have 1 interface , 2 classes:
public interface ihello {     string sayhello(); }  public class englishhello : ihello {     public string sayhello()     {         return "hello";     } }  public class frenchhello : ihello {     public string sayhello()     {         return "bonjour";     } }   then have consumer class, in want select instance injected:
public class helloconsumer {     private readonly ihello helloservice;      public helloconsumer([withkey("en")] ihello helloservice)     {         if (helloservice == null)         {             throw new argumentnullexception("helloservice");         }         this.helloservice = helloservice;     }      public string sayhello()     {         return this.helloservice.sayhello();     } }   registering , resolving:
containerbuilder cb = new containerbuilder();  cb.registertype<englishhello>().keyed<ihello>("en"); cb.registertype<frenchhello>().keyed<ihello>("fr"); cb.registertype<helloconsumer>().withattributefilter(); var container = cb.build();  var consumer = container.resolve<helloconsumer>(); console.writeline(consumer.sayhello());   do not forget attributefilter when register such consumer, otherwise resolve fail.
another way use lambda instead of attribute.
cb.register<helloconsumer>(ctx => new helloconsumer(ctx.resolvekeyed<ihello>("en")));   i find second option cleaner since avoid reference autofac assemblies in project (just import attribute), part personal opinion of course.
Comments
Post a Comment