asp.net web api - How can I add a Dependency that can be used as type parameter 'TImpl' for Castle Windsor? -
i getting runtime exception particular url:
"missing dependency. component nrbq.web.controllers.deliverycontroller has dependency on seastore.data.legacy.interfaces.inrbqdeliveryrepository, not resolved. create sure dependency correctly registered in container service, or provided inline argument." exceptiontype: "castle.microkernel.resolvers.dependencyresolverexception"
...so added code (based on existing code works) ioc class:
_container.register (component .for<inrbqdeliveryrepository>() .implementedby<deliverycontroller>() .lifestyle.transient);
in context:
private static castle.windsor.iwindsorcontainer _container; _container = new castle.windsor.windsorcontainer(); _container.addfacility<castle.facilities.factorysupport.factorysupportfacility>(); . . . _container.register (component .for<inrbqdeliveryrepository>() .implementedby<deliverycontroller>() .lifestyle.transient);
...but won't compile; get:
the type 'nrbq.api.controllers.deliverycontroller' cannot used type parameter 'timpl' in generic type or method 'castle.microkernel.registration.componentregistration.implementedby()'. there no implicit reference conversion 'nrbq.api.controllers.deliverycontroller' 'seastore.data.legacy.interfaces.inrbqdeliveryrepository'.
i know bit myseterious (i'm omitting of import details in question), i'm not sure additional clues should add.
updatein response whether deliverycontroller implements inrbqdeliveryrepository: actually, there 3 controller-type things; user-facing 1 in nrbq.web:
public class deliverycontroller : apicontroller { private readonly inrbqdeliveryrepository _deliveryrepository; public deliverycontroller(inrbqdeliveryrepository deliveryrepository) { if (deliveryrepository == null) { throw new argumentnullexception("deliveriescontroller"); } _deliveryrepository = deliveryrepository; } [route("api/deliveries/count")] public int getcountofdeliveryrecords() { homecoming _deliveryrepository.getcount(); } . . .
...then middle 1 in nrbq.client:
namespace nrbq.client { public class restnrbqdelivery : inrbqdelivery { inrbqclientsettings nrbqclientsettings; irestapiclient restapiclient; public restnrbqdelivery(irestapiclient restapiclient, inrbqclientsettings nrbqclientsettings) { this.nrbqclientsettings = nrbqclientsettings; this.restapiclient = restapiclient; } public restnrbqdelivery(irestapiclient restapiclient, inrbqclientsettings nrbqclientsettings, authenticationheadervalue authheader) { this.nrbqclientsettings = nrbqclientsettings; this.restapiclient = restapiclient; this.restapiclient.authheader = authheader; } public int getcount() { throw new notimplementedexception(); //todo: implement }
....and 1 behind-the-scenes heavy lifting, in nrbq.api:
namespace nrbq.api.controllers { public class deliverycontroller : apicontroller { ilogger logger; inrbqservice nrbqservice; public deliverycontroller(ilogger logger, inrbqservice nrbqservice) { this.nrbqservice = nrbqservice; this.logger = logger; } [httpget] [route("api/deliveries/count")] public int getcountofdeliveryrecords() { //return _deliveryrepository.getcount(); homecoming nrbqservice.getnrbqentity(); }
that lastly phone call refers here:
public int getnrbqentity() { homecoming 17; // bogus val }
this best effort @ copying existing test/sample code, admit head swimming , don't grok what's happening (how , why).
update 2although i'm pretty sure it's still not quite nathan's hot dog (it seems chase on creation, calling first abstraction, one, another, first, another, second, etc. etc. advertisement infinitum advertisement nauseum advillium), adding this:
container.register (component .for<inrbqdelivery>() .implementedby<restnrbqdelivery>() .lifestyle.transient);
...in context:
public class nrbqclientinstaller : iwindsorinstaller { public void install(iwindsorcontainer container, iconfigurationstore store) { container.register (component .for<seastore.common.http.irestapiclient>() .implementedby<seastore.common.http.webapiclient>() .lifestyle.transient); container.register (component .for<inrbqclient>() .implementedby<restnrbqclient>() .lifestyle.transient); container.register (component .for<inrbqdelivery>() .implementedby<restnrbqdelivery>() .lifestyle.transient); } }
...got rid of err msg , returned false result expecting (or, rather, hoping for, not expecting).
in iwindsorinstaller unit, register interface , implementer:
container.register (component .for<inrbqdelivery>() .implementedby<restnrbqdelivery>() .lifestyle.transient);
asp.net-web-api dependency-injection castle-windsor ioc-container dependency-resolver
No comments:
Post a Comment