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