我有一个使用模型程序集(带有Model类)的asp.net应用程序用于业务逻辑。此模型程序集通过IMailService接口依赖于MailService,我正在尝试使用MEF来填充模型对MailService实现的需求。我正在Model类的构造函数中进行MEF组合。
这背后的想法是创建一个MailService程序集,我可以在我的网站之间重用,而网站本身不需要知道邮件是如何发送的。也许IoC容器是一个更好的选择,但我只是认为MEF方法更容易理解,我喜欢通过组合部件来组合我的应用程序的想法。如果您与IoC容器进行比较,那么mef方法是否有任何负面影响?
[Import]
private IMailService _mailService;
public Model()
{
Compose();
}
private void Compose()
{
DirectoryCatalog cat = new DirectoryCatalog(Settings.Default.PluginsFolder);
var container = new CompositionContainer(cat);
container.ComposeParts(this);
}
下面的代码在另一个程序集中,而另一个程序集中的接口
[Export(typeof(IMailService))]
public class MailService : IMailService
{
}
这在模型程序集的单元测试中工作正常,但是当我通过我的asp.net站点使用模型程序集时,它失败,下面有例外。我还尝试在web.config中将信任设置为full,但仍然没有运气
构图保持不变。该 变更被拒绝了因为 以下错误:组成 产生了单一的构图错误。 根本原因如下。 查看CompositionException.Errors 财产更详细 信息。
1)没有找到匹配的出口 约束 '((exportDefinition.ContractName = “ExtensionInterfaces.IMailService”)&& (exportDefinition.Metadata.ContainsKey( “ExportTypeIdentity”) &安培;&安培; “ExtensionInterfaces.IMailService” .Equals(exportDefinition.Metadata.get_Item( “ExportTypeIdentity”))))”
导致:无法设置导入 Model.Model._mailService (ContractName = “ExtensionInterfaces.IMailService”)” 在部分Model.Model'上。元件: Model.Model._mailService (ContractName = “ExtensionInterfaces.IMailService”) - > Model.Model
答案 0 :(得分:1)
我还没有在Web应用程序中使用MEF,但是如果我猜测我会认为在plugins目录中读取程序集存在一些问题。可能是权限问题或其他问题。无论如何,我首先要检查DirectoryCatalog以查看它是否包含您期望的内容。
答案 1 :(得分:1)
我发现错误,我在bin文件夹中有一个程序集,其名称与我的导出的MailService程序集相同。由于某种原因,目录在bin文件夹中拾取了程序集,而不是我指定的目录中的程序集。不知道为什么但是当我从bin文件夹中删除旧的程序集时它起作用了。