导入基数的Autofac例外

时间:2014-07-22 15:09:46

标签: c# asp.net-mvc mef autofac

我在MVC网站上使用Autofac和MEF。基本上我已经为网站编写了一个插件系统。插件位于文件夹中,我创建了一个DirectoryCatalog并将其注册到Autofac。

我创建了另一个项目作为我的插件并进行了测试。

一切都按预期工作。我控制器导入很好,我可以导航到我的插件中的MVC区域。

当我添加第二个插件(基本相同,只是不同的命名/命名空间)时,Autofac会抛出有关基数的错误。

'exports' cannot contain more than one element when ImportDefinition.ImportCardinality is ImportCardinality.ZeroOrOne or ImportCardinality.ExactlyOne. Parameter name: exports

我已经检查了我的DirectoryCatalog并且所有导出都出现在那里。我可以很好地导航到我的主机中的控制器,但当我导航到我的插件的控制器,我得到一个错误。如果我删除其中一个插件,那么一切正常。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

尝试删除输出文件夹中的所有内容[用于创建DirectoryCatalog的文件夹]。

仅在使用Autofac.Integration.Mef。

时才有效

我们遇到了同样的问题,基本上所有开发人员在重命名项目后签出时都会出现此错误,并且解决方案始终相同:只需删除输出文件夹。

这里发生了什么:

创建DirectoryCatalog时,Mef会搜索输出文件夹中的所有.dll文件。但是输出文件夹可能包含旧的,不需要的.dll文件,因为当您重建解决方案时,文件不会被删除,文件正在被替换,因此如果您将程序集从OldName.dll重命名为NewName.dll,输出文件夹将包含两个文件而不是一个文件,如果两个dll具有相同的导出,则Mef可能会崩溃。

这实际上是正常的,它按预期工作,最大的问题是Autofac.Integration.Mef引发的奇怪的错误消息。 Mef会抛出更好的错误信息。

答案 1 :(得分:0)

刚遇到同样的错误。清除我的输出文件夹并没有解决它。

原来我的问题出在我的插件中的Autofac注册中。

我有重复的.Exported条目类似于下面的内容:

builder.RegisterType<FileStreamFactory>()
            .As<IFileStreamFactory>()
            .Exported(x => x.As<IFileStreamFactory>());
builder.RegisterType<XmlWriterFactory>()
            .As<IXmlWriterFactory>()
            .Exported(x => x.As<IFileStreamFactory>());

因此,请务必检查所有Autofac注册是否有重复项。我是因为一些不好的复制癌症。