1

我有一个 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 中将信任设置为完全,但仍然没有运气

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

1) 找不到与约束匹配的导出 '((exportDefinition.ContractName = "ExtensionInterfaces.IMailService") && (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") && "ExtensionInterfaces.IMailService".Equals(exportDefinition.Metadata.get_Item( “ExportTypeIdentity”))))'。

导致:无法在零件 Model.Model' 上设置 import Model.Model._mailService (ContractName="ExtensionInterfaces.IMailService")'。元素:Model.Model._mailService (ContractName="ExtensionInterfaces.IMailService") --> Model.Model

4

2 回答 2

1

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

于 2009-08-24T15:30:26.533 回答
1

我还没有在 Web 应用程序中使用过 MEF,但是如果我猜的话,我会假设在读取插件目录中的程序集时存在一些问题。也许是权限问题之类的。无论如何,我将首先检查 DirectoryCatalog 以查看它是否包含您所期望的内容。

于 2009-08-24T05:26:54.853 回答