Виндзор Разрешить со словарем аргументов
Я использую 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 ответ
Причина в том, что зависимость устанавливается дважды: сначала в качестве параметра.ctor, а затем снова в качестве свойства.
Windsor выполняет сопоставление имен параметров без учета регистра при сопоставлении параметров из конфигурации xml и от анонимного типа, а передаваемый строковый аргумент имеет приоритет над xml, как и следовало ожидать.
Однако вы дали ему Hashtable
что вы настроили, чтобы учитывать регистр, и Виндзор чтит это.
Так что это соответствует a
.ctor аргумент, но затем он идет, чтобы установить A
собственность, а Hashtable
не предоставляет значение для этого, поэтому он получает один из вас XML.
относительно
если я поменяю местами разрешения opt1 и opt2, утверждение 2 не будет выполнено.
Вы не опубликовали свою конфигурацию xml, но я подозреваю, что образ жизни компонента - синглтон, и в этом случае второй вызов Resolve
просто даст вам объект, созданный первым вызовом, и любые аргументы, которые вы передадите, будут проигнорированы.
Обычно вы, вероятно, не выставляете сеттеры для свойств, устанавливаемых через.ctor, и сохраняете их только для чтения.