在我的StructureMap引導代碼中,我使用自定義約定來掃描程序集,並將接口/實現對添加到對象圖作爲命名實例。基本上我有一些邏輯,檢查配置設置和向下鑽取取決於各種條件這一說法:命名實例和StructureMap中的默認實例?
registry.For(interfaceType).Use(type)
.Named(implementationName);
這增加了所有的命名實例不夠好的。不過,如果未指定實例名稱,我還想添加一個默認實例。但是,默認實例並不總是添加到圖中的最後一個實例。有時在掃描期間添加其他命名實例。但是,似乎無論最後添加哪個實例,無論它是否被命名,始終都是默認值。
我已經試過了流暢的API的各種組合,包括:
registry.For(interfaceType).Add(type);
或:
registry.For(interfaceType).Use(type);
即使是一些被標記爲已過時的那些的。但由此產生的行爲總是最後一個是默認的。因此,如果將實現的順序是這樣的:
- 記錄程序界面中使用名爲「log4net的」
- 記錄程序接口log4net的實現中使用默認
- log4net的執行記錄程序接口使用名爲「模擬」的模擬實現
由此產生的行爲是,當沒有指定名稱時,「模擬」實現用作默認值。調試到容器AllInstances
,我看到以下順序:
- 名爲「log4net的」 log4net的記錄器的實例
- 的名稱與一個GUID log4net的記錄器的一個實例(像任何其他默認例如,據我可以告訴)
- 名爲「模擬」
調試到從容器調用時沒有一個實例名稱,但是,在模擬執行結果的日誌記錄語句模擬記錄器的實例正在使用。
有沒有辦法將一個默認實例添加到對象圖中,同時仍然能夠添加命名實例?