是否可以通过向参数添加属性来控制创建依赖项?
示例:
Public Sub New(textService As ITextService, <RequireWebService> addressService As IAddressService)
m_TextService = textService
m_AddressService = addressService
End Sub
应使用默认逻辑解析ITextService。但是IAddressService应该得到一个不同的实现,具体取决于这个&#34; RequireWebService&#34;属性存在。
答案 0 :(得分:0)
您想要创建自己的IHandlerSelector
。 Windsor使用此接口允许您控制Windsor尝试解析组件时选择的服务。这里有一些你可以做的伪代码(抱歉C# - 我没有任何VB.NET代码示例):
public class AddressServiceSelector : IHandlerSelector
{
public bool HasOpinionAbout(string key, Type service)
{
// tell Windsor you'd like to "help" it resolve the IAddressService
return service == typeof(IAddressService);
}
public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
{
// "webServiceAvailable" is some flag that is globally available
// to your application which indicates the flag for how the IAddressService
// is resolved.
if (webServiceAvailable)
{
return handlers.Where(
h => h.ComponentModel.Implementation == typeof (WebAddressService))
.FirstOrDefault();
}
return handlers.Where(
h => h.ComponentModel.Implementation == typeof(FileAddressService))
.FirstOrDefault();
}
}
使用以下命令配置Windsor以使用此处理程序:
container.Kernel.AddHandlerSelector(new AddressServiceSelector());
在此示例中,我假设您在Windsor中注册了两个IAddressService
实现(WebAddressService
和FileAddressService
)。您还需要一些“标志”可用于选择过程的处理程序。如果Windsor尝试解析IAddressService
时此标志为真,您将获得WebAddressService
。否则,您将获得FileAddressService
。
答案 1 :(得分:0)
谢谢你们。
我使用ISubDependencyResolver构建了一个小工作测试。
但正如@Phil所说,这是一个坏主意。所以我会采取另一种方式。