Примитивные типы и контейнеры IoC - PullRequest
6 голосов
/ 29 января 2009

Как вы обрабатываете примитивные типы при использовании контейнера 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 constructor?

Ответы [ 4 ]

4 голосов
/ 29 января 2009

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

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

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

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

3 голосов
/ 29 января 2009

Я не уверен, что ваша трудность связана с типом значений или конкретным типом. Ни одна из них не является проблемой. Вам не нужно вводить интерфейс конфигурации (это полезно, если вы хотите передать одни и те же параметры нескольким объектам, но не в том случае, который вы указали). Как бы то ни было, вот беглый код Виндзора, я уверен, что кто-то скоро отправит версию 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")
                )
            );
1 голос
/ 29 января 2009

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

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

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

1 голос
/ 29 января 2009

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

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

ForRequestedType<Pinger>()
  .TheDefault.Is.OfConcreteType<Pinger>()
  .WithCtorArg("timeout").EqualTo(5000)
  .WithCtorArg("targetMachine").EqualToAppSetting("machine");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...