2013-05-28 57 views
9

在我的StructureMap引導代碼中,我使用自定義約定來掃描程序集,並將接口/實現對添加到對象圖作爲命名實例。基本上我有一些邏輯,檢查配置設置和向下鑽取取決於各種條件這一說法:命名實例和StructureMap中的默認實例?

registry.For(interfaceType).Use(type) 
    .Named(implementationName); 

這增加了所有的命名實例不夠好的。不過,如果未指定實例名稱,我還想添加一個默認實例。但是,默認實例並不總是添加到圖中的最後一個實例。有時在掃描期間添加其他命名實例。但是,似乎無論最後添加哪個實例,無論它是否被命名,始終都是默認值。

我已經試過了流暢的API的各種組合,包括:

registry.For(interfaceType).Add(type); 

或:

registry.For(interfaceType).Use(type); 

即使是一些被標記爲已過時的那些的。但由此產生的行爲總是最後一個是默認的。因此,如果將實現的順序是這樣的:

  1. 記錄程序界面中使用名爲「log4net的」
  2. 記錄程序接口log4net的實現中使用默認
  3. log4net的執行記錄程序接口使用名爲「模擬」的模擬實現

由此產生的行爲是,當沒有指定名稱時,「模擬」實現用作默認值。調試到容器AllInstances,我看到以下順序:

  1. 名爲「log4net的」 log4net的記錄器的實例
  2. 的名稱與一個GUID log4net的記錄器的一個實例(像任何其他默認例如,據我可以告訴)
  3. 名爲「模擬」

調試到從容器調用時沒有一個實例名稱,但是,在模擬執行結果的日誌記錄語句模擬記錄器的實例正在使用。

有沒有辦法將一個默認實例添加到對象圖中,同時仍然能夠添加命名實例?

回答

20

Add方法將添加實例(如果您需要添加命名實例或添加多個實例以與集合/枚舉一起使用)。如果未註冊明確的默認值(使用Use方法),則添加的最後一個實例將成爲默認實例。 Use方法用於設置默認實例。如果多次調用Use,則註冊的最後一個實例將成爲默認值。

爲了設置一個默認實例,然後註冊進一步命名實例,你應該能夠做到這一點是這樣的:

registry.For(typeof(Logger)).Use(typeof(Log4Net)).Named("Log4Net"); 
registry.For(typeof(Logger)).Add(typeof(Mock)).Named("Mock"); 

這將使Log4Net實例的默認,也可以作爲命名實例訪問。 Mock實例將作爲命名實例提供。

相關問題