排队MEF合同的问题

时间:2011-03-08 01:23:49

标签: c# 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     {         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()或字符串契约应该是什么。

1 个答案:

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