2011-06-09 57 views
0

我想爲IoC容器返回的應用程序的一部分定義一個外觀,在我的情況下是StructureMap。 Facade有一個構造函數,它沒有設置默認實現的參數,而另一個是我可以定義Facade管理的不同子系統對象的自定義實現。StructureMap和外牆

但是,由於StructureMap試圖使用最多參數調用構造函數的外觀實例,因此如果未註冊其他子系統的實現,它將失敗。

我的問題是:有沒有什麼辦法告訴StructureMap嘗試使用下面的構造函數,如果它不能使用主要的?或者我必須告訴StructureMap選擇哪個構造函數?

+0

也許有點示例代碼將一些可視化的幫助。 – IAbstract 2011-06-09 13:16:07

+0

如果可能,始終只有一個帶參數的構造函數。不要創建一個初始化類型的默認構造函數。這樣,你的類型仍然與具體的依賴關係緊密結合,這使得它很難交換。讓StructureMap完成它的工作。 – Steven 2011-06-09 13:42:30

+0

使用帶參數的單個構造函數雖然仍然很少,但在這種情況下,大多數情況下會超出使用外觀的目的。關於添加一些示例,我不知道是否真的需要,畢竟,我的問題不需要太多的代碼。如果有一個具有多個構造函數的類,那麼StructureMap將選擇第一個具有更大數字的參數,如果參數,我想知道的是如果StructureMap在異常情況下可以以某種方式使用其他構造函數作爲回退。 – Neverbirth 2011-06-09 14:18:49

回答

1

據我所知,不可能讓StructureMap試圖解決一個實例,並且如果不成功的話最好還是回到替代ctors。

我認爲使用StructureMap連接外觀的依賴關係也是一個好主意,並在那裏指定默認值。也許可以使用Null對象實現作爲可能缺失的子系統的默認對象。

+0

我也想過它,但我想知道StructureMap是否能夠做我想問的問題。我認爲這將是一個很好的補充,不是嗎? – Neverbirth 2011-06-09 14:21:06

1

您可以指定一個委託,將如下創建您的類型:

container.Configure(r => r.For<IFacade>().Use(() => new RealFacade())); 
+1

好點,比我的解決方案好(爲什麼這是一種熟悉的感覺) – thekip 2011-06-09 17:14:58

+0

是的,我也意識到了這一點,儘管我更喜歡在這種情況下使用構造函數選擇器。無論如何,只是我的個人品味,因爲我不知道他們是否有任何優勢或劣勢,也許這種其他選擇更好,也許這個好可能成爲其他線程的主題。 – Neverbirth 2011-06-09 21:40:26

+0

@Neverbirth:根據您使用的DI容器,直接調用構造函數可能有缺點。 *簡單的注射器*,例如,不會對該類型進行任何後期初始化(使用'RegisterInitializer'方法)。 *另一方面,StructureMap *(使用'OnCreationForAll'方法)。據我所知,Unity *甚至沒有這樣的功能。無論哪種方式,當您向構造函數添加依賴項時,必須更改DI配置。這是明顯的缺點。 – Steven 2011-06-10 06:53:25