【发布时间】:2014-06-23 23:09:45
【问题描述】:
我在特定的 URL 中遇到了这个运行时异常:
"缺少依赖项。组件 NRBQ.Web.Controllers.DeliveryController 对 SeaStore.Data.Legacy.Interfaces.INRBQDeliveryRepository 有依赖项,无法解析。确保依赖项在容器中正确注册为服务,或作为内联参数提供。” 异常类型:“Castle.MicroKernel.Resolvers.DependencyResolverException”
...所以我将此代码(基于有效的现有代码)添加到 IOC 类:
_container.Register
(Component
.For<INRBQDeliveryRepository>()
.ImplementedBy<DeliveryController>()
.LifeStyle.Transient);
在某些情况下:
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);
...但这甚至不会编译;我现在得到:
类型“NRBQ.API.Controllers.DeliveryController”不能用作泛型类型或方法“Castle.MicroKernel.Registration.ComponentRegistration.ImplementedBy()”中的类型参数“TImpl”。没有从“NRBQ.API.Controllers.DeliveryController”到“SeaStore.Data.Legacy.Interfaces.INRBQDeliveryRepository”的隐式引用转换。
我知道这可能有点神秘(我可能在这个问题中省略了一些重要的细节),但我不确定我应该添加哪些额外的线索。
更新
针对DeliveryController是否实现了INRBQDeliveryRepository:其实有3个controller类型的东西; 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()
{
return _deliveryRepository.GetCount();
}
. . .
...然后是 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
}
....最后是真正在 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();
return NRBQService.GetNRBQEntity();
}
最后一次调用指的是这里:
public int GetNRBQEntity()
{
return 17; // Bogus val for now
}
这一切都是我复制现有测试/示例代码的最佳尝试,但我承认我的头脑在游泳,我并不真正了解发生了什么(如何以及为什么)。
更新 2
虽然我很确定它仍然不是 Nathan 的热狗(它似乎在整个创作中追逐自己,首先调用这个抽象,然后调用那个抽象,然后调用另一个,然后回到第一个,然后是另一个,然后返回到第二个,等等,等等,ad infinitum ad nauseum advillium),加上这个:
container.Register
(Component
.For<INRBQDelivery>()
.ImplementedBy<RESTNRBQDelivery>()
.LifeStyle.Transient);
...在上下文中:
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);
}
}
...摆脱了 err msg 并返回了我期待的假结果(或者,更确切地说,希望,不是真的期待)。
【问题讨论】:
-
您确定 DeliveryController 实现了 INRBQDeliverRepository 吗?
-
@JonathonRossi 这听起来像是最可能的原因;仔细检查您导入的命名空间不包含类似命名的类
-
谢谢@samy 我试图使用github.com/castleproject/Windsor/blob/master/docs/… 给出的示例使用Windsor,但出现错误类型'ClassLibrary1.Dependency1'不能用作泛型类型或方法中的类型参数'TImpl' 'Castle.MicroKernel.Registration.ComponentRegistration
.ImplementedBy ()'。没有从“ClassLibrary1.Dependency1”到“CastleWindsorExample.IDependency1”的隐式引用转换。发现我在两个项目中都有 IDependency1 接口
标签: asp.net-web-api dependency-injection castle-windsor ioc-container dependency-resolver