【发布时间】:2023-03-03 14:00:01
【问题描述】:
我目前正在工作中设计一个新的消息翻译系统,有以下关于 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....
}
}
但是,我想使用统一通过构造函数将翻译器实例注入到我的翻译器服务中。在服务内的方法中使用。
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 尽可能通用,所以如果需要另一个翻译,我只需要换掉 Translator 接口的具体实现。
2) 如果这是可能的,我将如何做到这一点,然后我将在我的统一配置中拥有什么来做到这一点。注意我正在使用 XML 配置(不是我的选择)来 配置我的依赖等。
提前致谢
斯图尔特
【问题讨论】:
-
您的“在服务中的方法中使用。”显示了非通用接口的用法,该接口在帖子的其他任何地方都没有提到...可能您只是错过了一些声明...
-
所以一方面你想定义一个通用接口,但另一方面你又不希望它在使用/注入到 TranslatorService 时是通用的?
-
我之所以有上述构造函数是我不确定是否可以这样做,服务代码只是作为示例。我正在尝试编写一个通用的翻译器类,可以在调用者认为合适的情况下实现,但如果可能的话,我试图避免的主要事情是让翻译器的调用者必须指定类型,理想情况下这将由统一控制容器(再次仅在可能的情况下)。
-
您能展示一下 TranslatorService 的客户端代码是如何编写的吗?例如,当这些客户不/不应该知道消息的确切类型以及它们是如何翻译时,他们期望的输入和输出类型是什么?
标签: c# generics dependency-injection unity-container