使用泛型的Unity配置

时间:2014-10-07 19:23:10

标签: c# generics dependency-injection unity-container

我目前正在设计一个新的消息翻译系统,并且有关于DI和Unity的以下问题。

我有以下界面:

public interface ITranslate<TInput, TOutput>
{
    TOutput TranslateMessage(TInput message);
}

使用下面的具体实现(其中InternalMessage是我开发的自定义类)

public class TestTranslate : ITranslate<byte[], InternalMessage>
{
    InternalMessage Translate(byte[] message)
    {
        // Do the translation here and return the result....
    }
}

但是我想使用unity通过构造函数将转换器实例注入我的转换器服务。用于服务中的方法。

public class TranslatorService
{    
    private readonly ITranslator translator;
    public TranslatorService(ITranslate translator)
    {
        this.translator = translator;
    }

    public byte[] DoTranslate(string message)
    {
        return translator.TranslateMessage(message);
    }
}

但是我有两个问题:

1)是否可以在构造函数中使用ITranslate而无需指定转换程序将处理的类型(我正在尝试保留服务) 和翻译器尽可能通用,所以如果需要另一个翻译,我只需要换掉Translator接口的具体实现。)

2)如果这是可能的,我该怎么做呢?然后在我的统一配置中我会做什么呢?注意我使用的是XML配置(不是我的选择) 配置我的依赖等。

提前致谢

斯图尔特

1 个答案:

答案 0 :(得分:0)

经过一番思考后,我假设您要执行以下操作:

  1. 在某些时候,不同类型的消息进入并且必须是 不知何故,翻译成其他类型。
  2. 接收这些消息的组件/客户端应该并且不应该知道应该如何翻译不同类型的消息。
  3. 因此,您希望实现一个通用的TranslatorService类,它根据输入消息接收任何消息并进行神奇翻译。
  4. 对于每个特定的翻译,您希望定义一个特定的通用Translator类,它由TranslatorService类自动实例化并使用,最好使用某种类型的依赖注入。
  5. 如果我的假设是正确的,我会建议以下设计。

    首先,定义一个必须由每个专门的Translator-class实现的通用接口。只使输入类型通用:

    interface IMessageTranslator<TMessage>
    {
        object Translate(TMessage message);
    }
    

    然后创建TranslatorService,以便当且仅当存在该消息的转换器时,客户端才能推送任意消息并将结果返回给它们:

    class TranslatorService
    {
        object Translate(object message)
        {
    
        }
    }
    

    现在TranslatorService必须根据消息的类型实例化正确的IMessageTranslator<T>您可以通过让TranslatorService类封装包含所有{{{ 1}} - 您已实现的类型,然后根据消息类型简单地实例化一个:

    IMessageTranslator<T>

    请注意,这是一个简单的实现,关于翻译器是否实际存在/是为指定的消息注册,以及它是否找到Translate方法(更好地通过InterfaceMap获取),但是你得到了想法。

    如果您想要更大的灵活性,可以创建一种机制,通过扫描IMessageTranslator实现者的程序集来自动填充容器。这样,您只需添加一个新的实现就可以了。