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