Windsor用参数字典解析

Mat*_*ias 1 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");
    }
Run Code Online (Sandbox Code Playgroud)

这太怪异了.这两个断言都成功了.但是如果我交换opt1和opt2 resolvations,断言2就会失败.

Krz*_*mic 5

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

从xml config和匿名类型匹配参数时,Windsor会进行区分大小写的参数名称匹配,并且您传递的内联参数优先于xml,就像您期望的那样.

然而,你给了它Hashtable,你设立区分大小写和温莎荣誉这一点.

所以它匹配a.ctor参数,但它然后转到set A属性,并且Hashtable没有为它提供值,所以它从你那里抓取一个XML.

关于

如果我交换opt1和opt2 resolvations,断言2失败.

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

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