我目前正在设计一个新的消息翻译系统,并且有关于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配置(不是我的选择) 配置我的依赖等。
提前致谢
斯图尔特
答案 0 :(得分:0)
经过一番思考后,我假设您要执行以下操作:
如果我的假设是正确的,我会建议以下设计。
首先,定义一个必须由每个专门的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实现者的程序集来自动填充容器。这样,您只需添加一个新的实现就可以了。