0

我收到了带有特定 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 并返回了我期待的假结果(或者,更确切地说,希望,不是真的期待)。

4

1 回答 1

0

在您的 IWindsorInstaller 单元中,注册接口及其实现者:

container.Register
 (Component
 .For<INRBQDelivery>()
 .ImplementedBy<RESTNRBQDelivery>()
 .LifeStyle.Transient);
于 2014-06-24T21:42:36.617 回答