Примитивные типы и контейнеры IoC

Как вы обрабатываете примитивные типы при использовании контейнера IoC?

т.е. учитывая, что у вас есть:

class Pinger {
    private int timeout;
    private string targetMachine;

    public Pinger(int timeout, string targetMachine) {
        this.timeout = timeout;
        this.targetMachine = targetMachine;
    }

    public void CheckPing() {
        ...
    }
}

Как бы вы получили аргументы конструктора int и string?


person Andreas    schedule 29.01.2009    source источник


Ответы (4)


Сделайте для этого другой интерфейс.

Тогда вы получите что-то вроде:

public Pinger(IExtraConfiguration extraConfig)
{
   timeout = extraconfig.TimeOut;
   targetmachine = extraconfig.TargetMachine;
}

Я не знаю о других контейнерах IOC, но Castle Windsor автоматически разрешает эти дополнительные параметры конструктора.

person Gerrie Schenck    schedule 29.01.2009
comment
С одной стороны, это не решает проблему, а с другой — усложняет. Мы должны признать, что время от времени IoC деформирует ваш код неестественным образом с негативными последствиями. Если вам нужно создать Order с различными типами Cupcake, вам придется внедрить экземпляр и изменить его с помощью вызовов методов (сильный запах). Вы можете внедрить контекст, но как это динамически настраивается во время выполнения? Вы должны мутировать и это тоже. Пришло время вытащить голову из песка и смириться с неоспоримой красотой IoC. - person Rick O'Shea; 15.01.2017

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

container.Register(
            Component.For(typeof(Pinger))
                .ImplementedBy(typeof(Pinger))  // This might not be necessary
                .Parameters(Parameter.ForKey("timeout").Eq("5000"),
                            Parameter.ForKey("targetMachine").Eq("machine")
                )
            );
person Julian Birch    schedule 29.01.2009

По-разному. IoC-Container StructureMap позволит вам объявить эти зависимости при настройке экземпляра в начале выполнения.

например в реестре

ForRequestedType<Pinger>()
  .TheDefault.Is.OfConcreteType<Pinger>()
  .WithCtorArg("timeout").EqualTo(5000)
  .WithCtorArg("targetMachine").EqualToAppSetting("machine");
person flq    schedule 29.01.2009

В Spring можно искать значения свойств в файле свойств, используя нотацию ${propertyName}.

<bean class="blah.Pinger">
    <constructor-arg value="${blah.timeout}"/>
    <constructor-arg value="${blah.targetMachine}"/>
</bean>

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

person Andy    schedule 29.01.2009