我正在尝试使用Unity Configuration将依赖项添加到类属性中,并且我尝试注入的类型是通用的。

我有界面

public interface ISendMessage
{
    void Send(string contact, string message);
}




public class EmailService : ISendMessage
{
    public void Send(string contact, string message)
    {
        // do
    }
}




public class MessageService<T> where T : ISendMessage
{
}


我尝试通过其他类中的构造函数注入来使用它

public MyService(MessageService<ISendMessage> messageService)
{
}


如何注入MessageService<EmailService>而不是MessageService<ISendMessage>

我尝试通过app.config

<alias alias="MessageService'1" type="MyNamespace.MessageService'1, MyAssembly" />
    <alias alias="EmailMessageService'1" type="MyNamespace.MessageService'1[[MyNamespace.EmailService, MyAssembly]], MyAssembly" />


我得到错误


类型名称或别名MessageService'1无法解析。请
检查您的配置文件并验证此类型名称。


以及如何传递MessageService<T>实现参数MessageService<EmailService>

谢谢

更新资料

我将班级修改为以下内容:

public class MessageService<T> where T : ISendMessage
    {
        private T service;

        [Dependency]
        public T Service
        {
            get { return service; }
            set { service = value; }
        }
}


并使用配置

<alias alias="ISendMessage" type="MyNamespace.ISendMessage, MyAssembly" />
    <alias alias="EmailService" type="MyNamespace.EmailService, MyAssembly" />

<register type="ISendMessage" mapTo="EmailService">
        </register>


有用 :-)

最佳答案

您不能简单地将MessageService<ISendMessage>强制转换为MessageService<EmailService>。为此,您需要MessageService<T>是变体。仅接口(和委托)支持方差。这不是Unity的事情,这是.NET框架的“局限性”(从4.0开始在C#中受支持)。因此,您需要实现以下接口:

// note the 'out' keyword!!
public interface IMessageService<out T>
    where T : ISendMessage
{
    T GetSendMessage();
}


MessageService<T>类将必须实现此接口。但是即使有了这段代码,Unity也不会自动注入。您将必须在两种类型之间进行映射。例如,这是可能的注册:

container.Register<MessageService<ISendMessage>>(
    new InjectionFactory(c =>
        c.Resolve<MessageService<EmailService>>()));


请注意,我使用基于代码的配置。尽可能避免使用基于XML的配置,因为XML配置易碎,容易出错,功能较弱且难以维护。仅注册在部署期间或之后实际需要的类型(就个人而言,即使如此,我也不会使用您的DI容器的XML API)。

关于c# - 如何使用Unity映射通用类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11207886/

10-13 03:16