C# 将部分构造函数参数传递给castle windsor容器

C# 将部分构造函数参数传递给castle windsor容器,c#,.net,castle-windsor,C#,.net,Castle Windsor,我有一个构造函数 Foo(IColor c , int someNumber) 我只在运行时知道some数字,我想在解析过程中调用这个构造函数,并传递someNumber值和要强制解析的IColor 大概是这样的: container.Resolve<IFoo>(someNumber); container.Resolve(someNumber); 可以这样做吗?是的,在匿名类型的实例中传递构造函数参数;属性名称必须与构造函数参数名称匹配: IColor desiredColo

我有一个构造函数

Foo(IColor c , int someNumber)
我只在运行时知道some数字,我想在解析过程中调用这个构造函数,并传递
someNumber
值和要强制解析的
IColor

大概是这样的:

container.Resolve<IFoo>(someNumber);
container.Resolve(someNumber);

可以这样做吗?

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

IColor desiredColor = //whatever
int desiredNumber = //whatever else
IFoo foo = container.Resolve<IFoo>(new { c = desiredColor, somenumber = desiredArgumentValue });
IColor desiredColor=//随便什么
int desiredNumber=//其他任何内容
IFoo foo=container.Resolve(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);
IColor desiredColor=//随便什么
int desiredNumber=//随便什么
字典参数=新字典();
参数。添加(“c”,所需颜色);
参数。添加(“somenumber”,desiredNumber);
IFoo foo=container.Resolve(参数);

您应该更喜欢类型化工厂,而不是使用类似容器的服务定位器。只需定义工厂界面:

public interface IFooFactory {
    IFoo Create(int somenumber);
}
并将其注册为类型化工厂:

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

欲了解更多信息,请回答。这是否意味着如果我使用这个工厂,我总是要记住在使用后释放对象?文档中说:“记住,默认情况下,Windsor中的所有组件都是单例组件,并且使用默认发布策略容器会保留对所有组件的引用,即使是临时组件。这就是为什么通过类型化工厂发布组件很重要的原因。还要注意您分配给通过设施解析的组件的生命周期。”是的,这是最佳做法。为此,您可以在factory界面上定义
void Destroy(IFoo组件)
方法,或者在组件中实现
IDisposable
,并对其进行处理。然后它将被发布。IColor参数呢?@Darragh我已经编辑了答案以包含相应的参数。
var foo = fooFactory.Create(desiredArgumentValue);