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());
}
}