2012-11-09 101 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