通过参数属性控制依赖性

时间:2016-04-14 12:05:43

标签: vb.net castle-windsor

是否可以通过向参数添加属性来控制创建依赖项?

示例:

Public Sub New(textService As ITextService, <RequireWebService> addressService As IAddressService)
    m_TextService = textService
    m_AddressService = addressService
End Sub

应使用默认逻辑解析ITextService。但是IAddressService应该得到一个不同的实现,具体取决于这个&#34; RequireWebService&#34;属性存在。

2 个答案:

答案 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实现(WebAddressServiceFileAddressService)。您还需要一些“标志”可用于选择过程的处理程序。如果Windsor尝试解析IAddressService时此标志为真,您将获得WebAddressService。否则,您将获得FileAddressService

答案 1 :(得分:0)

谢谢你们。

我使用ISubDependencyResolver构建了一个小工作测试。

但正如@Phil所说,这是一个坏主意。所以我会采取另一种方式。