2013-03-07 88 views
5

我想構建一個控制檯應用程序,它在運行時加載一個程序集,並實現一個接口。重點是創建一個.dll,其中包含可以通過更改.dll進行更改的指令。StructureMap:'AddAllTypesOf'不向ObjectFactory添加程序集?

我的VS2012解決方案存在3個項目:接口,實現它的庫和控制檯應用程序。 (正因爲如此,所有三個都有自己的命名空間,也許這是一個問題?)庫和控制檯應用程序都有對接口項目的引用。

在將程序集添加到ObjectFactory後,在使用GetAllInstances時未找到它們。當使用AssembliesFromPath時會發現它們,但添加似乎不起作用。

這裏是我的代碼:

var dir = "..\\..\\..\\ComputeLibrary\\bin\\Debug"; 
ObjectFactory.Initialize(cfg => 
{ 
    cfg.Scan(scanner => 
    { 
     scanner.AssembliesFromPath(dir); 
     scanner.AddAllTypesOf(typeof(ICompute)).NameBy(i => i.Name); 
    }); 
}); 
var list = ObjectFactory.GetAllInstances<ICompute>().ToList(); 
list.ForEach(item => item.Test()); 

如果有人想看看整個解決方案,它可here

我可能在這裏做錯了什麼,但我似乎無法找到它是什麼。 這是應該如何使用它?還是我應該看看MEF做這樣的事情?

+1

根據文檔,您的代碼看起來與期望的一致。你已經在調試器中用一個斷點運行了這個,並且在'scanner.AssembliesFromPath(dir);'行執行後驗證了掃描器實例是否具有預期的程序集? – cfeduke 2013-03-07 12:59:58

+0

是的,運行該行後,掃描儀包含2個組件:界面和庫,而在此之前,有0. [屏幕截圖](http://i.imgur.com/Z0znR0Y.png) – Yves 2013-03-07 13:06:22

+0

如果你消除'.NameBy'?我想知道是否有可能導致吞嚥異常,導致無法將類添加到掃描儀中。 – cfeduke 2013-03-07 14:38:37

回答

3

這讓我困惑了一陣子,直到我記住了Structuremap google group中的this thread

當您運行應用程序時,會加載ComputeInterface.dll程序集。當你掃描ComputeLibrary文件夾時,再次加載相同的程序集,這使得Structuremap變得混亂,因爲接口只能從一個程序集中實現。嘗試從ComputeLibrary \ bin \ Debug文件夾中刪除ComputeInterface.dll,它將起作用。

+0

謝謝,刪除界面DLL確實解決了問題。我永遠不會想出這個。 – Yves 2013-03-07 21:03:57