我有这堂课:
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");
}
}
我正试图导出到:
公共类HandlerContainer { public HandlerContainer() { 处理程序=新列表&gt;(); }
[ImportMany()]
public List<IHandles<IDomainEvent>> Handlers { get; set; }
}
我得到的例外是:
1)导出'Multi_Tenant_MEF_Solution.NewMemberWasRegisteredHandler(ContractName =“Multi_Tenant_MEF_Solution.IHandles(Multi_Tenant_MEF_Solution.IDomainEvent)”)'不能分配给'Multi_Tenant_MEF_Solution.IHandles`1 [[Multi_Tenant_MEF_Solution.IDomainEvent,Multi-Tenant-MEF-Solution] ,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]'。
我是一个MEF新手(2个小时),所以这让我感到困惑。我能找到的所有例子都使用了Import和Export的无参数构造函数,所以我不清楚我的typeof()或字符串契约应该是什么。
答案 0 :(得分:2)
问题是NewMemberWasRegisteredHandler
无法转换为IHandles<IDomainEvent>
。通过使用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());
}
}
您收到编译错误,无法将NewMemberWasRegisteredHandler
转换为IHandles<IDomainEvent>
。这是因为DOMAINEVENT
在IHandles
接口中不是协变的。您可以通过添加out
关键字使其变得协变,但是您的Handle方法将不合法。