2011-03-08 60 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方法將不合法。