我在我的应用程序中使用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就会失败.
原因是依赖项设置了两次: - 首先作为.ctor参数 - 然后再作为属性
从xml config和匿名类型匹配参数时,Windsor会进行非区分大小写的参数名称匹配,并且您传递的内联参数优先于xml,就像您期望的那样.
然而,你给了它Hashtable,你设立是区分大小写和温莎荣誉这一点.
所以它匹配a.ctor参数,但它然后转到set A属性,并且Hashtable没有为它提供值,所以它从你那里抓取一个XML.
关于
如果我交换opt1和opt2 resolvations,断言2失败.
你没有发布你的xml配置,但我怀疑组件的生活方式是单例,在这种情况下,第二次调用Resolve只会给你第一次调用构造的对象,你传递的任何参数都将被忽略.
通常,您可能不会通过.ctor公开设置属性的setter并将它们保持为只读.