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