如何添加可用作温莎城堡类型参数"TImpl"的依赖项?



我得到这个运行时异常与一个特定的URL:

" 失踪的依赖。组件nrbq . web . controller . deliverycontroller依赖于SeaStore.Data.Legacy.Interfaces。INRBQDeliveryRepository,无法解决。确保依赖项作为服务在容器中正确注册,或者作为内联参数提供。"ExceptionType:"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是否实现了INRBQDeliveryRepository:实际上,有三种控制器类型的东西;在NRBQ中面向用户的一个。网络:

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的中间部分。客户:

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

虽然我很确定它仍然不完全是内森热狗(它似乎在整个创造中追逐自己,首先调用这个抽象,然后那个,然后另一个,然后回到第一个,然后另一个,然后回到第二个,等等等等),并添加了这个:

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并返回我所期望的假结果(或者,更确切地说,希望,而不是真正期望)。

在你的IWindsorInstaller单元中,注册接口和它的实施者:

container.Register
 (Component
 .For<INRBQDelivery>()
 .ImplementedBy<RESTNRBQDelivery>()
 .LifeStyle.Transient);

最新更新