Mef和asp.net问题

时间:2009-08-22 21:57:33

标签: asp.net mef

我有一个使用模型程序集(带有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

2 个答案:

答案 0 :(得分:1)

我还没有在Web应用程序中使用MEF,但是如果我猜测我会认为在plugins目录中读取程序集存在一些问题。可能是权限问题或其他问题。无论如何,我首先要检查DirectoryCatalog以查看它是否包含您期望的内容。

答案 1 :(得分:1)

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