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控制器。一个用于登录,一个用于刷卡支付。日志记录使用一个日志记录提供程序,而这个提供程序又使用一个IService
。CardPaymentController
接受一个卡支付提供商,而卡支付提供商又接受一个IService
。CardPaymentProvider
应该获得安全服务,日志提供者应该获得正常服务
代码如下:
注册:
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
提供服务的安全实现-只是正常版本。
我做错了什么?
您必须在同一注册中定义服务覆盖。而不是:
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")),