Использование строго типизированных параметров конфигурации в установщике Windsor - PullRequest
0 голосов
/ 24 марта 2011

Я ломал голову над установкой контейнера Windsor с помощью пользовательского объекта конфигурации. Это кажется простым, но, видимо, есть что-то важное, чего я просто не понимаю. Я буду благодарен, если вы поможете мне заполнить этот пробел.

У меня есть класс конфигурации:

class MyConfiguration
{
    int SomeIntValue;
    DateTime SomeDateValue;
    Action<string> SomeActionValue;
}

Я хочу передать эти значения конфигурации в качестве параметров конструктора в зарегистрированные реализации. Я думаю, что регистрация должна выглядеть примерно так:

public class MyInstaller : IWindsorInstaller
{
   public void Install(IWindsorContainer container, IConfigurationStore store)
   {
      container.Register(Component.For<IFoo>.ImplementedBy<Foo>
        .Parameters(Parameter.ForKey("parameter1").Eq( INSERT VALUE HERE (?) );
   }
}

Так как мне взять эти значения и передать их в установщик? Должен ли я использовать этот IConfigurationStore параметр? Если да, то как мне его заполнить и что мне с ним делать?

Кроме того, кажется, что все объекты конфигурации могут хранить только строковые значения, так как я могу передать значения, которые не являются строками (например, DateTime)?

Спасибо и хороших выходных.

Ответы [ 2 ]

8 голосов
/ 25 марта 2011

В подавляющем большинстве случаев вам не нужно явно регистрировать аргумент конструктора.Функция auto-wiring должна автоматически позаботиться об этом.Это сделает ваш код менее хрупким и, следовательно, более легким в обслуживании .

Итак, лучшее, что вы можете сделать, это просто зарегистрировать MyConfiguration в контейнере.Если это только одна регистрация типа (нормальный сценарий), контейнер может однозначно разрешить любой запрос на тип.Таким образом, если другой класс принимает MyConfiguration в качестве параметра конструктора, Castle Windsor автоматически сопоставит их с вами.Вам не нужно указывать это явно.

Однако существуют случаи, когда вам необходимо явно назначить конкретное значение параметра.Для этих случаев вы можете использовать ServiceOverrides.Это может выглядеть примерно так:

container.Register(Component.For<MyConfiguration>().Named("myConfig"));
container.Register(Component
    .For<IFoo>()
    .ImplementedBy<Foo>()
    .ServiceOverrides(new { parameter1 = "myConfig" }));

Если вам нужно назначить конкретный экземпляр, вместо этого вы можете использовать DependsOn:

var myConfig = new MyConfig();
container.Register(Component
    .For<IFoo>()
    .ImplementedBy<Foo>()
    .DependsOn(new { parameter1 = myConfig }));
1 голос
/ 11 октября 2012

, если вы пытаетесь передать значение типа, такое как целое число, строка, перечисление и т. Д., Тогда переходите ко второму варианту, заданному Марком.

int val = 23;
container.Register(Component
    .For<IFoo>()
    .ImplementedBy<Foo>()
    .DependsOn(new { parameter1 = val }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...