我有class
。
public class Foo
{
public Foo(string a, string b)
{
}
public Foo(string a, byte[] b)
{
}
}
我正在尝试注册Foo
并使用public Foo(string a, string b)
构造函数。但是,Windsor不会查看传入的值的类型并选择错误的构造函数。
程序:
class Program
{
public void Main()
{
var container = new WindsorContainer();
container.Register(Component.For<Foo>()
.DependsOn(Dependency.OnValue("a", "Bar"))
.DependsOn(Dependency.OnValue("b", "Baz")));
// Blows up trying to convert string to byte[]
var foo = container.Resolve<Foo>();
}
}
我如何帮助Windsor选择正确的构造函数?
请注意,在我的真实代码中,我尝试使用App.Config
从Dependency.OnAppSettingsValue
中提取值。
编辑:
我通过创建一个调用适当构造函数的包装类来解决这个问题。
public class FooInjectionWrapper
{
public FooInjectionWrapper(string a, string b)
{
Foo = new Foo(a, b);
}
public Foo Foo { get; private set; }
}
程序:
class Program
{
public void Main()
{
var container = new WindsorContainer();
container.Register(Component.For<FooInjectionWrapper>()
.DependsOn(Dependency.OnValue("a", "Bar"))
.DependsOn(Dependency.OnValue("b", "Baz")));
container.Register(Component.For<Foo>()
.UsingFactoryMethod(k => k.Resolve<FooInjectionWrapper>().Foo));
//Works fine
var foo = container.Resolve<Foo>();
}
}
答案 0 :(得分:2)
Windsor没有为选择构造函数提供支持。 Windsor(和其他容器)认为所有构造函数都是相同的。如果一切都相同,组件具有的依赖性越多,它应具有的功能就越多。这就是为什么温莎会挑选最贪婪的构造函数的原因。如果相同,它只会选择任何构造函数:http://docs.castleproject.org/Windsor.How-constructor-is-selected.ashx
解决方法是使用工厂方法:
container.Register(
Component.For<Foo>()
.UsingFactoryMethod(() => new Foo("Bar", "Baz")));
答案 1 :(得分:1)
始终可以为字符串类型定义一个值,而不是&#34; b&#34;参数。命名优先于类型,因此&#34; a&#34;可以定义参数,并且可以并行定义字符串类型:
var container = new WindsorContainer();
container.Register(Component.For<Foo>()
.DependsOn(Dependency.OnValue("a", "Bar"))
.DependsOn(Dependency.OnValue(typeof(string), "Baz")));