Windsor Ioc服务覆盖:已经为给定的键注册了一个组件

本文关键字:注册 组件 一个 覆盖 服务 Ioc Windsor | 更新日期: 2023-09-27 18:12:17

我一直在尝试配置Windsor,以便根据正在构建的类为服务提供不同的实现:

我读过这个http://docs.castleproject.org/Windsor.Registering-components-one-by-one.ashx Supplying_the_component_for_a_dependency_to_use_Service_override_9

我昨天问了这个问题Windsor Ioc容器:如何注册某些构造函数采用接口的不同实现

当我直接解析类时,这个问题的答案正确工作,但当它在几个层次的对象图中,并且我想要覆盖的类被用作另一个接口在不同注册中的默认实现

我有两个MVC控制器。一个用于登录,一个用于刷卡支付。日志记录使用一个日志记录提供程序,而这个提供程序又使用一个IServiceCardPaymentController接受一个卡支付提供商,而卡支付提供商又接受一个IServiceCardPaymentProvider应该获得安全服务,日志提供者应该获得正常服务

代码如下:

注册:

Component.For<ILoggingProvider>().ImplementedBy<LoggingProvider>(),
Component.For<ICardPaymentProvider>().ImplementedBy<CardPaymentProvider>(),
Component.For<IService>().ImplementedBy<WebService>().Named("default"),
Component.For<IService>().ImplementedBy<SecureWebService>().Named("secure"),
Component.For<CardPaymentProvider>().ServiceOverrides(ServiceOverride.ForKey("service").Eq("secure")),
Component.For<LoggingProvider>().ServiceOverrides(ServiceOverride.ForKey("service").Eq("default"))

类层次结构:

 public LoggingController(ILoggingProvider loggingProvider)
 {
            this.loggingProvider = loggingProvider;
 }
 public CardPaymentController(ICardPaymentProvider cardPaymentProvider)
{
            this.cardPaymentProvider = cardPaymentProvider;
}
    public interface IService
    {
        void Doit();
    }
    public class WebService : IService
    {
        public void Doit()
        {
            throw new NotImplementedException();
        }
    }
    public class SecureWebService : IService
    {
        public void Doit()
        {
            throw new NotImplementedException();
        }
    }
    public class CardPaymentProvider : ICardPaymentProvider
    {
        private readonly IService service;
        public CardPaymentProvider(IService service)
        {
            this.service = service;
        }
    }
    public interface ICardPaymentProvider
    {
    }
    public class LoggingProvider : ILoggingProvider
    {
        private readonly IService service;
        public LoggingProvider(IService service)
        {
            this.service = service;
        }
    }
    public interface ILoggingProvider
    {
    }

在启动时产生错误:

"有一个组件已经注册了给定的键峰值。CardPaymentProvider "

如果我将Named("somename")添加到CardPaymentProvider注册或ICardPaymentProvider注册中,则它开始正常,但不为CardPaymentProvider提供服务的安全实现-只是正常版本。

我做错了什么?

Windsor Ioc服务覆盖:已经为给定的键注册了一个组件

您必须在同一注册中定义服务覆盖。而不是:

Component.For<ICardPaymentProvider>().ImplementedBy<CardPaymentProvider>(),
Component.For<CardPaymentProvider>().ServiceOverrides(ServiceOverride.ForKey("service").Eq("secure")),

:

Component.For<ICardPaymentProvider>()
         .ImplementedBy<CardPaymentProvider>()
         .ServiceOverrides(ServiceOverride.ForKey("service").Eq("secure")),