Виндзор Разрешить со словарем аргументов - PullRequest
1 голос
/ 18 октября 2011

Я использую Castle.Windsor в своем приложении. Мои компоненты и их параметры настраиваются в файле app.config. Но я также хочу иметь возможность передавать параметры с помощью аргументов командной строки. Это значит cmd-args > config-args. Я пытался использовать container.Resolve<Class>(dictionary). Но это не сработало (используются config-args). Любопытно, если я использую анонимный тип, это работает.

Заранее спасибо.

EDIT

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 Ответ

5 голосов
/ 18 октября 2011

Причина в том, что зависимость устанавливается дважды: сначала в качестве параметра .ctor, а затем снова в качестве свойства

Виндзор выполняет не сопоставление имени параметра с учетом регистракогда вы сопоставляете свои параметры из конфигурации xml и от анонимного типа, а передаваемый строковый аргумент имеет приоритет над xml, как и следовало ожидать.

Однако вы дали ему Hashtable, который вы установили для be с учетом регистра, и Виндзор соблюдает это.

Таким образом, он соответствует аргументу a .ctor, но затем он устанавливает свойство A, а Hashtable не предоставляетзначение для этого, поэтому он получает один из вас XML.

Относительно

, если я поменяю местами разрешения opt1 и opt2, утверждение 2 не будет выполнено.

Youя не опубликовал вашу конфигурацию xml, но я подозреваю, что образ жизни компонента одноэлементный, и в этом случае второй вызов Resolve просто даст вам объект, созданный первым вызовом, и любые аргументы, которые вы передадите, будут проигнорированы.

Обычно вы, вероятно, не выставляете сеттеры для свойств, устанавливаемых через .ctor, и сохраняете их только для чтения.

...