C# 排列MEF合同的问题

C# 排列MEF合同的问题,c#,mef,C#,Mef,我有这门课: public interface IHandles<DOMAINEVENT> where DOMAINEVENT : IDomainEvent { void Handle(DOMAINEVENT args); } [Export(typeof(IHandles<IDomainEvent>))] public class NewMemberWasRegisteredHandler : IHandles<NewMemberWasRegistere

我有这门课:

public interface IHandles<DOMAINEVENT> where DOMAINEVENT : IDomainEvent
{
    void Handle(DOMAINEVENT args);
}

[Export(typeof(IHandles<IDomainEvent>))]
public class NewMemberWasRegisteredHandler : IHandles<NewMemberWasRegistered>
{
    public void Handle(NewMemberWasRegistered args)
    {
        //EmailSender.Send
        Console.WriteLine("***New Member Registration Email Sent");
    }
}
公共接口i处理其中的DOMAINEVENT:IDomainEvent
{
无效句柄(DOMAINEVENT参数);
}
[导出(类型(IHandles))]
公共类NewMemberWasRegisteredHandler:IHandles
{
公共无效句柄(NewMemberWasRegistered参数)
{
//电子邮件发送者,发送
Console.WriteLine(“发送***新会员注册电子邮件”);
}
}
我正试图将其导出到:

公共类手提集装箱 { 公共HandlerContainer() { 处理程序=新列表>(); }

[ImportMany()]
公共列表处理程序{get;set;}
}
我得到的例外是:

1) 导出“Multi_Tenant\u MEF\u Solution.NewMemberWasRegisteredHandler”(ContractName=“Multi_Tenant\u MEF\u Solution.IHandles(Multi_Tenant\u MEF\u Solution.IDomainEvent)”)不可分配给类型“Multi_Tenant\u MEF\u Solution.IHandles`1[[Multi_Tenant_MEF_Solution.IDomainEvent,Multi-Tenant MEF Solution,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]'


我是一个MEF新手(2小时),所以这让我感到困惑。我能找到的所有示例都使用导入和导出的无参数构造函数,所以我不清楚我的类型()或者字符串协定应该是。

问题是
NewMemberWasRegisteredHandler
无法转换为
IHandles
。通过使用MEF并覆盖导出的协定,您将获得运行时错误,如果没有MEF,您将获得编译时错误。以下是没有MEF时的情况:

public interface IDomainEvent { }

public class NewMemberWasRegistered : IDomainEvent { }

public interface IHandles<DOMAINEVENT> where DOMAINEVENT : IDomainEvent
{
    void Handle(DOMAINEVENT args);
}

public class NewMemberWasRegisteredHandler : IHandles<NewMemberWasRegistered>
{
    public void Handle(NewMemberWasRegistered args) { }
}

public class HandlerContainer
{
    public List<IHandles<IDomainEvent>> Handlers { get; set; }

    public HandlerContainer()
    {
        Handlers = new List<IHandles<IDomainEvent>>();

        Handlers.Add(new NewMemberWasRegisteredHandler());
    }

}
公共接口IDomainEvent{}
公共类NewMemberWasRegistered:IDomainEvent{}
公共接口i处理其中的DOMAINEVENT:IDomainEvent
{
无效句柄(DOMAINEVENT参数);
}
公共类NewMemberWasRegisteredHandler:IHandles
{
公共无效句柄(NewMemberWasRegistered参数){}
}
公共类手提集装箱
{
公共列表处理程序{get;set;}
公共HandlerContainer()
{
Handlers=新列表();
Add(NewMemberWasRegisteredHandler());
}
}
您得到一个编译错误,无法将
NewMemberWasRegisteredHandler
转换为
IHandles
。这是因为
DOMAINEVENT
IHandles
界面中不协变。您可以通过添加
out
关键字使其协变,但您的句柄方法将不合法

public interface IDomainEvent { }

public class NewMemberWasRegistered : IDomainEvent { }

public interface IHandles<DOMAINEVENT> where DOMAINEVENT : IDomainEvent
{
    void Handle(DOMAINEVENT args);
}

public class NewMemberWasRegisteredHandler : IHandles<NewMemberWasRegistered>
{
    public void Handle(NewMemberWasRegistered args) { }
}

public class HandlerContainer
{
    public List<IHandles<IDomainEvent>> Handlers { get; set; }

    public HandlerContainer()
    {
        Handlers = new List<IHandles<IDomainEvent>>();

        Handlers.Add(new NewMemberWasRegisteredHandler());
    }

}