2

一個類有一個以IMyInterface爲參數的獨特構造函數。如果我定義了IMyInterface的具體類型並將其註冊到StructureMap,那麼就沒有問題,我的類可以通過這個具體類型來實例化。如何使用StructureMap將默認構造函數參數設置爲null?

但是,在某些情況下,沒有具體的類型將被註冊。在這種情況下,我想爲IMyInterface參數收到null。相反,我得到一個異常:

StructureMap異常代碼:202 沒有默認實例爲PluginFamily IMyInterface定義。

是否可以爲缺少的插件定義默認值?

上下文:我的類是一個服務,它使用Spark視圖引擎並定義一些默認名稱空間。該服務使用ISparkNamespacesProvider(IMyInterface)添加輔助名稱空間。客戶端應用程序可以註冊這樣的提供者或不註冊。這就是爲什麼該服務的構造函數將收到提供者或沒有提供者。

回答

2

here摘自:

For<IService>().Use<MyService>() 
.Ctor<IMyInterface>("nameOfParameter").Is(null); 

但你應該想想爲什麼你的等級取決於IMyInterface。如果它是可選的 - 這是一種代碼味道。也許你應該重構它作爲需要它的方法參數或作爲可設置的屬性。

應該不需要在具體實現和null之間切換。在合成根目錄下編寫依賴關係圖時,您應該確切知道您的依賴關係(不包括.If(isSomething()).Use<MyService>().Ctor<IMyInterface>(null))。

您可能想要查看關於DI和IOC的this tekpub presentation和this book(查找所謂的MEAP訪問)。


一種方法來實現你想要的是使用所謂的'poor man dependency injection'。那就是 - 定義第二個構造函數:

public MyClass():this(null){...} 

但我不會推薦。

+1

null必須轉換爲IMyInterface以避免模糊的調用。不幸的是它不起作用。當我定義一個具體類型並將其註冊到SM時,null仍然通過。所以看起來你的代碼並沒有定義一個默認參數,而是這個參數的強制值。如果我刪除你的代碼,則使用具體類型。 – 2010-10-06 21:33:30

+0

@Nicolas在配置中只應該指定一個具體的實現。否則 - 你的設計很可能是錯誤的。 – 2010-10-06 21:35:55

+0

@Nicolas也許你可以在這裏發佈需要'IMyInterface'的類嗎?構造函數和使用'IMyInterface'的部分。 – 2010-10-06 21:37:37

相關問題