2008-09-24 61 views
11

如何將參數傳遞給IOC框架中的構造函數? 我想要做的事,如:(試圖成爲IOC框架無關;))如何將參數傳遞給IOC框架中的構造函數

object objectToLogFor = xxx; 
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging 
{ 
    public MyLogging(object objectToLogFor){} 
} 

看來,這是不可能的StructureMap。但我很想看到有人證明我錯了。

其他框架功能豐富嗎?還是我用錯誤的方式使用IOC框架?

+1

有人知道如何使用Unity做到這一點? – mhamrah 2009-02-27 17:28:04

回答

0

是的,其他框架功能更豐富 - 您需要使用允許構造函數注入的ioc框架。 Spring是允許構造器依賴注入的多語言ioc容器的一個例子。

+0

SM確實允許這樣做,因此反對投票 – Schneider 2009-04-16 14:37:54

4

這怎麼可能是語言不可知的?這是有關框架的實現細節。

Spring允許您指定c'tor參數作爲值/參考的列表,如果這是您的事情。儘管如此,與財產注入相比,它不是很可讀。

有些人因此受到關注,並堅持c'tor注入是java中唯一的線程安全方法。從技術上講,他們是正確的,但在實踐中它往往不重要。

3

它不應該是一個非常普遍的需求,但有時它是一個有效的。 Ninject比StructureMap輕,允許您在從上下文中檢索瞬態對象時傳遞參數。 Spring.NET

大多數情況下,在IoC容器中聲明的對象不是瞬態的,並且通過構造函數/屬性/方法接受其他非瞬態對象作爲依賴關係。但是,如果您真的不想將容器用作工廠,並且如果您對要解析的對象具有足夠的控制權,即使聽起來不那麼自然且風險更高,也可以使用屬性或方法注入某種程度上來說。

0

其他IoC框架功能更豐富。

I.e.檢查出ParameterResolution與Autofac

+0

我再次投票表示這是它的虛假信息。 SM支持用戶所要求的內容,所以更多「功能豐富」與解決海報問題無關。 – Schneider 2009-04-16 14:40:40

0

你也可以做到這一點與溫莎容易

5

對於城堡溫莎:

var foo = "foo"; 
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo }); 

note使用匿名對象來指定構造函數參數。

使用StructureMap:

var foo = "foo"; 
var service = container.With(foo).GetInstance<TContract>(); 
相關問題