2012-07-30 67 views

回答

7

是的,在匿名類型的實例中傳遞構造函數參數;如果您使用的是C#的舊版本不支持匿名類型(或者即使你不是)

IColor desiredColor = //whatever 
int desiredNumber = //whatever else 
IFoo foo = container.Resolve<IFoo>(new { c = desiredColor, somenumber = desiredArgumentValue }); 

,你可以做同樣的一本字典:屬性名必須在構造函數的參數名稱相匹配:

IColor desiredColor = //whatever 
int desiredNumber = //whatever 
Dictionary<string, object> arguments = new Dictionary<string, object>(); 
arguments.Add("c", desiredColor); 
arguments.Add("somenumber", desiredNumber); 
IFoo foo = container.Resolve<IFoo>(arguments); 
+0

IColor參數如何? – Darragh 2013-10-25 10:42:27

+0

@Darragh我編輯了包含相應參數的答案。 – phoog 2013-12-09 21:20:52

17

您應該更喜歡使用Typed Factory而不是像使用容器一樣的服務定位器。只要定義工廠接口:

public interface IFooFactory { 
    IFoo Create(int somenumber); 
} 

並將其註冊爲輸入工廠:

container.Register(Component.For<IFooFactory>().AsFactory()); 

然後使用依賴注入注入工廠,並使用它:

var foo = fooFactory.Create(desiredArgumentValue); 

欲瞭解更多信息read Windsor documentation

+0

很好的答案。這是否意味着如果我使用這個工廠,我總是必須記住在使用它之後釋放對象?該文件說:「請記住,默認情況下,Windsor中的所有組件都是單例,使用默認的發佈策略容器可以保持對所有組件的引用,即使是暫時的引用也是如此,這就是爲什麼通過類型化工廠發佈組件非常重要。組件通過設施解決。「 – 2013-07-18 05:46:57

+0

是的,這是最佳實踐。你可以在工廠接口上爲此定義'void Destroy(IFoo component)'方法,或者在你的組件中實現'IDisposable'並處理它。然後它會被釋放。 – 2013-07-18 07:35:13