Сериализация конфигураций для внедрения зависимости / инверсии управления - PullRequest
3 голосов
/ 09 июня 2010

В последнее время я изучал методы внедрения зависимостей и инверсии управления, пытаясь улучшить архитектуру нашей прикладной среды, и я не могу найти хорошего ответа на этот вопрос.Весьма вероятно, что моя терминология запутана, перепутана или что я просто наивен в отношении концепции прямо сейчас, поэтому любые ссылки или разъяснения приветствуются.

Многие примеры контейнеров DI и IoC не• Проиллюстрируйте, как контейнер будет связывать вещи вместе, когда у вас есть «библиотека» возможных «плагинов», или как «сериализовать» заданную конфигурацию.(Из того, что я читал о MEF, наличие нескольких объявлений [Export] для одного и того же типа не будет работать, если для вашего объекта требуется только 1 [Import]).Может быть, это другой шаблон или я ослеплен моим текущим мышлением.

Вот пример кода для примера:

public abstract class Engine {
}

public class FastEngine : Engine {
}

public class MediumEngine : Engine {
}

public class SlowEngine : Engine {
}

public class Car
{
    public Car(Engine e)
    {
        engine = e;
    }

    private Engine engine;
}

В этом посте говорится о "детализированном контексте"где 2 экземпляра одного и того же объекта нуждаются в различных реализациях класса Engine: IoC.Resolve vs Constructor Injection

Существует ли хорошая структура, которая помогает вам конфигурировать или сериализовать конфигурацию для достижениячто-то вроде этого без жесткого кодирования или ручного свертывания кода для этого?

public class Application
{
    public void Go()
    {
        Car c1 = new Car(new FastEngine());
        Car c2 = new Car(new SlowEngine());
    }
}

Пример XML:

<XML>
    <Cars>
        <Car name="c1" engine="FastEngine" />
        <Car name="c2" engine="SlowEngine" />
    </Cars>
</XML>

Ответы [ 3 ]

1 голос
/ 09 июня 2010

Я не знаю, что такое mef, но Spring делает именно то, что вы описываете, используя почти тот же метод, который вы описываете (инъекция, сконфигурированная с помощью XML-файла или раздела конфигурации):

<objects>
  <object name="FastCar" type="MyApp.Car">
    <constructor-arg>
       <ref object="FastEngine">
    </constructor-arg>
  </object>
  <object name="SlowCar" type="MyApp.Car">
    <constructor-arg>
       <ref object="SlowEngine">
    </constructor-arg>     
  </object>
  <object name="FastEngine" type="MyApp.FastEngine"/>
  <object name="SlowEngine" type="MyApp.SlowEngine"/>
</objects>
0 голосов
/ 09 июня 2010

Большинство DI-контейнеров поддерживают XML-конфигурацию - фактически, большинство из них начинали именно так, и XML-конфигурация была only .В настоящее время, XML-конфигурация является одним из нескольких вариантов .

Однако в своем текущем воплощении MEF не использует XML-конфигурацию.Это также не DI-контейнер.

0 голосов
/ 09 июня 2010

Используя MEF (который вы упомянули), вы можете использовать [ImportMany] для импорта коллекции экземпляров Engine. После этого вы сможете создать один автомобиль на двигатель и вернуть его, не требуя XML.

public class Application
{
    [ImportMany]
    public IEnumerable<Engine> Engines { get; set; }

    public void Go()
    {
        // I'm assuming this object was composed already...

        var cars = this.Engines.Select(e => new Car(e));

        foreach(var car in cars)
        {
            // Do something with each car
        }
    }
}

Это имеет то преимущество, что позволяет вам добавлять новые «движки» в любое время, не меняя код. Вся проводка обрабатывается динамически во время выполнения без настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...