Castle.Windsor可以使用类型和名称选择构造函数吗?

时间:2014-10-23 21:24:34

标签: c# castle-windsor

我有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.ConfigDependency.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>();
    }
}

2 个答案:

答案 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")));