我在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并且所有导出都出现在那里。我可以很好地导航到我的主机中的控制器,但当我导航到我的插件的控制器,我得到一个错误。如果我删除其中一个插件,那么一切正常。
非常感谢任何帮助。
答案 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注册是否有重复项。我是因为一些不好的复制癌症。