2011-03-08 63 views
1

我有这个类:问题排着队MEF合同

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 { 公共HandlerContainer(){ 处理程序 =新名单>(); }

[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 newb(2小时),所以这是莫名其妙的。我可以找到的所有示例都使用导入和导出的无参数构造函数,所以我不清楚我的typeof()或字符串合约应该是什么。

回答

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>编译错误。这是因为DOMAINEVENTIHandles接口中不是协变的。您可以通过添加out关键字来使其协变,但您的Handle方法将不合法。