将构造函数参数的一部分传递给城堡windsor容器

时间:2012-07-30 17:38:48

标签: c# .net castle-windsor

我有构造函数

Foo(IColor c , int someNumber)

我只知道运行时的某个数字,我想在解析过程中调用此构造函数并传递someNumber值,并IColor进行自我解析。

这样的事情:

container.Resolve<IFoo>(someNumber);

是否可以完成?

2 个答案:

答案 0 :(得分:18)

您应该更喜欢Typed Factory而不是使用像服务定位器这样的容器。只需定义工厂界面:

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

并将其注册为打字工厂:

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

然后使用依赖注入来注入工厂并使用它:

var foo = fooFactory.Create(desiredArgumentValue);

了解更多信息read Windsor documentation

答案 1 :(得分:8)

是的,在匿名类型的实例中传递构造函数参数;属性名称必须与构造函数参数名称匹配:

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

如果您使用的是不支持匿名类型的旧版C#(或者即使您不支持),也可以使用字典执行相同操作:

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);