Mef和asp.net问题

Mef和asp.net问题,asp.net,mef,Asp.net,Mef,我有一个asp.net应用程序,它使用一个用于业务逻辑的模型程序集(带有一个模型类)。此模型程序集通过IMailService接口依赖于MailService,我正在尝试使用MEF来满足MailService实现所需的模型。我正在模型类的构造函数中进行MEF合成 这背后的想法是创建一个MailService程序集,我可以在我的网站之间重用,而网站本身不需要知道邮件是如何发送的。也许IoC容器会是一个更好的选择,但我只是认为MEF方法更容易理解,我喜欢通过组合部分来编写应用程序的想法。如果与IoC

我有一个asp.net应用程序,它使用一个用于业务逻辑的模型程序集(带有一个模型类)。此模型程序集通过IMailService接口依赖于MailService,我正在尝试使用MEF来满足MailService实现所需的模型。我正在模型类的构造函数中进行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中将信任设置为完全信任,但仍然没有成功

组成保持不变。这个 更改被拒绝,因为 以下错误:合成错误 产生了一个构图错误。 下面提供了根本原因。 查看CompositionException.Errors 属性以获取更多详细信息 信息

1) 未找到匹配的导出 约束 “((exportDefinition.ContractName= “ExtensionInterface.IMailService”)&& (exportDefinition.Metadata.ContainsKey(“ExportTypeIdentity”) && “ExtensionInterfaces.IMailService”.Equals(exportDefinition.Metadata.get_项(“ExportTypeIdentity”))”

导致:无法设置导入 Model.Model.\u邮件服务 (ContractName=“ExtensionInterfaces.IMailService”)' 关于零件模型。要素: Model.Model.\u邮件服务 (ContractName=“extensionInterface.IMailService”) -->模型,模型


我还没有在web应用程序中使用MEF,但是如果我猜的话,我会假设在读取插件目录中的程序集时存在一些问题。可能是权限问题或其他什么。无论如何,我会先检查DirectoryCatalog,看看它是否包含您所期望的内容。

我发现了错误,我在bin文件夹中有一个程序集,与导出时的MailService程序集同名。出于某种原因,目录选择了bin文件夹中的程序集,而不是我指定的目录中的程序集。不知道为什么,但至少当我从bin文件夹中删除旧程序集时,它起了作用。

我怀疑,我也给了每个人对该文件夹的完全访问权限,将网站设置为完全信任。我甚至在网站中移动了plugins文件夹,但仍然没有成功。另外,单元测试调用spesific代码工作正常,因此在使用asp.net网站作为客户端时会出现问题。如果在过程中加载了旧程序集,并且旧程序集和新程序集具有完全相同的标识,则可能会发生此问题(即程序集名称、版本、键等)。DirectoryCatalog只执行程序集.Load(AssemblyName)操作,如果具有相同标识的程序集已加载到AppDomain中,则它将只使用已加载的程序集,而不是加载新的程序集,即使它们包含不同的代码。