Windsor用参数字典解析

时间:2011-10-17 21:06:52

标签: c# castle-windsor

我在我的应用程序中使用Castle.Windsor。我的组件及其参数在app.config文件中配置。但我也希望能够通过命令行参数传递参数。这意味着cmd-args > config-args。我尝试使用container.Resolve<Class>(dictionary)。但它不起作用(使用config-args)。奇怪的是,如果我使用匿名类型,它可以工作。

提前致谢。

修改

public class TestB
{
    public string A { get; set; }
    public string B { get; set; }

    public TestB(string a)
    {
        A = a;
        //B = b;
    }
}

         [Test]
    public void Test()
    {

        var dictionary = new Hashtable
                        {
                            { "a", "b" }
                        };

        var anonymousType = new
                            {
                                a = "b"
                            };

        WindsorContainer container = new WindsorContainer(new XmlInterpreter());

        var opt1 = container.Resolve<TestB>(anonymousType);
        var opt2 = container.Resolve<TestB>(dictionary);

        Assert.That(opt1.A == "b");
        Assert.That(opt2.A == "b");
    }
那是怪异的。这两个断言都成功了。但如果我交换opt1和opt2解析,断言2就会失败。

1 个答案:

答案 0 :(得分:5)

原因是依赖项设置了两次: - 首先作为.ctor参数 - 然后再作为财产

当匹配来自xml config和匿名类型的参数时,Windsor会执行 -case敏感参数名称匹配,并且您传递的内联参数优先于xml,就像您期望的那样。

但是你给它设置了一个Hashtable,你设置为 区分大小写,而温莎则尊重这一点。

所以它匹配a .ctor参数,但后来设置A属性,Hashtable没有为它提供值,所以它从你那里抓取一个

关于

  

如果我交换opt1和opt2解析,则断言2失败。

你没有发布你的xml配置,但我怀疑组件的生活方式是单例,在这种情况下,对Resolve的第二次调用只会给你第一次调用构造的对象,无论你有什么参数传球将被忽略。

通常情况下,您可能不会通过.ctor公开设置属性的setter并将它们保持为只读。