2012-11-09 66 views
0

我正在使用Prism和MEF扩展,并且在导入界面时遇到项目设置问题。问题在于,接口并不与具体实现相同的组件中(因为在其他项目中还有其他具体实现以及使用相同的接口)。MEF和导入到接口?

因此,因为我只有对接口的项目的引用,并且具体的实现从未在我的主应用程序中直接引用,所以它永远不会包含在bin目录中。所以在运行时MEF组合失败了,因为它试图注入一个没有包含实现的程序集的类。

这样做的正确方法是什么?我总是可以将它复制到bin目录中,但这很糟糕......或者我可以将它复制到一个插件目录中,但也很糟糕,因为其他具体实现必须位于同一个插件目录中。

要么我完全错过了某些东西,要么这对MEF来说不是很好用,或者......?

回答

1

MEF实现模块通常不会被主项目引用 - MEF的全部要点是能够在运行时加载不同的东西。

我在VS的主项目中创建一个后期构建动作,将MEF模块复制到主项目期望找到的MEF模块中 - 无论是bin还是bin的子目录。

您可改为更改每个MEF模块项目中的构建输出目录,以将模块二进制文件输出到主项目bin目录或bin的子目录。

我对Prism不熟悉,但对于带有.NET 4.0的普通旧MEF,我通常从主项目的配置文件中找到的信息构建MEF模块文件路径的MEF目录。 (加载目录中的所有dll是一个麻烦的邀请)

尽管主项目没有引用MEF模块,但在构建主项目时,仍然可以通过添加VS来构建MEF模块将MEF模块添加到主项目的项目依赖项中。确保所有MEF模块项目都包含在与主项目相同的解决方案中。右键单击解决方案资源管理器中的主项目,选择Project Dependencies,然后在所有MEF模块旁边打上复选标记。这也会导致在MEF模块更改时重新编译主项目,这并不是绝对必要的,但在您更改某个接口的情况下仍然是一个好主意。

+0

我不希望复制东西......我希望有一种方法可以将具体的实现程序集移动到当前的项目bin目录中,方法是将其包含在解决方案中 - 我将它作为项目依赖项添加建议,并建立它只是不转储执行程序集目录的输出。应该是? – Nicros

+0

您可以更改具体实现程序集的项目输出bin目录以指向您当前的项目bin目录。然后当它建立时,它只会输出到该目录。没有副本躺在身边。 – dthorpe

+0

项目依赖不会影响产出位置,它只是增加了关于当食物链中较低的食物链发生变化时需要在食物链中重建的更多信息的附加信息。项目依赖性执行与添加引用相同的功能,但不会在程序集之间创建硬引用。 – dthorpe