c# - Resolve IEnumerable with Autofac -
i trying build mediator pipeline mediatr , autofac struggling resolve collection of validators autofac.
public class mediatorpipeline<trequest, tresponse> : iasyncrequesthandler<trequest, tresponse> trequest : iasyncrequest<tresponse> { private readonly iasyncrequesthandler<trequest, tresponse> _inner; private readonly ienumerable<ivalidator<trequest>> _validators; public mediatorpipeline(iasyncrequesthandler<trequest, tresponse> inner, ienumerable<ivalidator<trequest>> validators) { _inner = inner; _validators = validators; } ... }
when put ivalidator<trequest>
in constructor resolves fine, when put ienumerable<ivalidator<trequest>>
fails, exception:
container or service locator not configured or handlers not registered container. ---> autofac.core.dependencyresolutionexception: error occurred during activation of particular registration.
here registration code:
builder.registerassemblytypes(assembly) .where(t => t.isclosedtypeof(typeof(ivalidator<>))) .asimplementedinterfaces() .instanceperlifetimescope();
i had same result alternative registration:
var opengenerictype = typeof(ivalidator<>); var query = type in assembly.gettypes().where(c => !(c.gettypeinfo().isabstract || c.gettypeinfo().isgenerictypedefinition)) let interfaces = type.getinterfaces() let genericinterfaces = interfaces.where(i => i.gettypeinfo().isgenerictype && i.getgenerictypedefinition() == opengenerictype) let matchinginterface = genericinterfaces.firstordefault() matchinginterface != null select new { matchinginterface, type }; foreach (var pair in query) { builder.registertype(pair.type).as(pair.matchinginterface); }
any suggestions appreciated!
first, nice see whole exception - inner exception included - stack trace.
autofac exposes handy extension method, asclosedtypesof
, can use way:
builder .registerassemblytypes(thisassembly) .asclosedtypesof(typeof(ivalidator<>)) .instanceperlifetimescope();
this work don't have go deep reflection register validators.
you need register handlers , decorator on top of them:
builder .registerassemblytypes(thisassembly) .asclosedtypesof(typeof(iasyncrequesthandler<,>), "base-handler") .instanceperdependency(); builder.registergenericdecorator( typeof(mediatorpipeline<,>), typeof(iasyncrequesthandler<,>), "base-handler");
Comments
Post a Comment