Foo(IColor c , int someNumber)
,我只知道在運行時的一些數字,我想在調用此構造函數的解析,並通過someNumber
價值專門解決IColor
。
事情是這樣的:
container.Resolve<IFoo>(someNumber);
是否可以做些什麼呢?
Foo(IColor c , int someNumber)
,我只知道在運行時的一些數字,我想在調用此構造函數的解析,並通過someNumber
價值專門解決IColor
。
事情是這樣的:
container.Resolve<IFoo>(someNumber);
是否可以做些什麼呢?
是的,在匿名類型的實例中傳遞構造函數參數;如果您使用的是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);
您應該更喜歡使用Typed Factory而不是像使用容器一樣的服務定位器。只要定義工廠接口:
public interface IFooFactory {
IFoo Create(int somenumber);
}
並將其註冊爲輸入工廠:
container.Register(Component.For<IFooFactory>().AsFactory());
然後使用依賴注入注入工廠,並使用它:
var foo = fooFactory.Create(desiredArgumentValue);
欲瞭解更多信息read Windsor documentation
很好的答案。這是否意味着如果我使用這個工廠,我總是必須記住在使用它之後釋放對象?該文件說:「請記住,默認情況下,Windsor中的所有組件都是單例,使用默認的發佈策略容器可以保持對所有組件的引用,即使是暫時的引用也是如此,這就是爲什麼通過類型化工廠發佈組件非常重要。組件通過設施解決。「 – 2013-07-18 05:46:57
是的,這是最佳實踐。你可以在工廠接口上爲此定義'void Destroy(IFoo component)'方法,或者在你的組件中實現'IDisposable'並處理它。然後它會被釋放。 – 2013-07-18 07:35:13
IColor參數如何? – Darragh 2013-10-25 10:42:27
@Darragh我編輯了包含相應參數的答案。 – phoog 2013-12-09 21:20:52