Виндзор Разрешить со словарем аргументов

Я использую 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, и сохраняете их только для чтения.

Другие вопросы по тегам