2012-07-30 68 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