1

我在SM回購上發佈了an issue可用於IHandler的StructureMap自動註冊處理程序<T><T>?

我的問題與this one類似,但我想本地化一個問題。

比方說,我有通用接口IPrinter<T>及其通用實現Printer<T>。當我做container.GetInstance<IPrinter<string>>時,我希望StructureMap解決具體的封閉類型Printer<string>

明確登記工作確定在這裏:

container.Configure(r => r.For(typeof (IPrinter<>)).Use(typeof (Printer<>)));

不過掃描的東西失敗:RegisterConcreteTypesAgainstTheFirstInterface()結果202 No Default Instance defined StructureMap異常,當我試圖解決IPrinter<string>

有沒有一種方法可以完成我想要的行爲,而無需顯式配置?

回答

1

ConnectImplementationsToTypeClosing()工作得很好,但你必須知道它是如何工作的。它註冊類型與添加()方法,它的行爲完全不同於使用使用()方法完成的註冊。詳細的解釋可以在here找到。總之,當你得到202錯誤代碼並不意味着你沒有註冊任何具體類型的請求插件類型。可能出現這種情況,您已經註冊了它們,並且沒有指定默認實例。

希望這會有所幫助。

編輯

通過這樣的:「這可能是因爲您已註冊他們的情況不止一個,並沒有默認實例被指定爲」我的意思是相同的插件類型的多於一個的實現被註冊,例如對於

IPrinter<string> 

您已經定義:

StringPrinter1 : IPrinter<string> and StringPrinter2 : IPrinter<string> 

不是說你被允許用於IPrinter <註冊只有一種類型>。

當你想註冊相同通用插件類型的多個實現時,

IPrinter<string> 

那麼我建議使用:

var container = new Container(c => c.Scan(s => s.AddAllTypesOf(typeof(IHandler<>)).NameBy(t => t.Name))); 

有命名的註冊,然後通過名稱明確地加以解決:

var stringPrinter1 = container.GetInstance<IPrinter<string>>("StringPrinter1"); 

或使用該登記:

c.For<IMyTypeUsingPrinter>().Use<MyTypeUsingPrinter>().Ctor<IPrinter<string>>().Named("StringPrinter1"); 

他們MyTypeUsingPrinter會將StringPrinter1注入爲IPrinter < string> dependency。

+0

謝謝!檢查更新,我說得更清楚。 '.For(typeof(IPrinter <>))。使用(typeof(Printer <>)'也可以,但我在尋找真正的自動註冊簡單案例的方法。只是一個泛型接口的一個(通用)實現 – vorou

+0

@vorou - 我編輯了我的答案,看一看 – LetMeCodeThis

+0

我知道明確的方法來做它我正在尋找的是*自動*我的意思是我想寫'RegisterConcreteTypesAgainstTheFirstInterface()'這一行。我不想列出我的應用程序中已註冊的所有通用類型。 – vorou