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

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -