c# - Autofac register derived types for an interface -
i have interface ibase many derived interfaces iderived1, iderived2. register implementations derived interfaces using autofac.
given derived interface, can write resolve method interface. i'm wondering is, there way can avoid enumerating list of derived interfaces when building container?
what have is:
public static void register<tderived>(containerbuilder b) tderived : ibase { b.register(cc => derivedfactory.create<tderived>(cc.resolve<somedependency>()) .as<tderived>() .instanceperlifetimescope(); } // in registration method containerbuilder b = ... methodinfo genericregisterderivedmethod = this.gettype().getmethod("register", bindingflags.public | bindingflags.static); list<type> allderivedinterfaces = /* query across various assemblies interfaces extend ibase */ allderivedinterfaces.foreach(t => genericregisterderivedmethod .makegenericmethod(t) .invoke(null, new object[] { b }) );
what i'd have is:
public static void create<tderived>(icomponentcontext cc) tderived : ibase { return derivedfactory.create<tderived>(cc.resolve<somedependency>()); } // in registration method containerbuilder b = ... methodinfo genericresolvederivedmethod = this.gettype().getmethod("create", bindingflags.public | bindingflags.static); b.registerderivedtypesof<ibase>((cc, t) => (ibase)genericresolvederivedmethod .makegenericmethod(t) .invoke(null, new object[] { cc, t }) );
this avoid me needing know full list of iderived interfaces when applications starts. possible?
i able solve using custom registration source, can build registration on fly each iderived
interface service type gets requested.
Comments
Post a Comment