Шаблон разработки стратегии с контейнерами МОК - Ninject конкретно

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

Рассматриваемый класс в настоящее время берет четыре параметра в конструкторе, каждый представляющий алгоритм.

Как с помощью Ninject (или обобщенный подход) я мог все еще использовать МОК, но использовать стратегическую модель?

Текущее ограничение - то, что мое ядро (контейнер) знает о каждом интерфейсе алгоритма, но это может только быть связано с одним реальным классом. Единственным путем вокруг этого, которое я вижу в данный момент, является передача во всех восьми алгоритмах в конструкции, но используйте различные интерфейсы, но это кажется полностью uncessary. Я не сделал бы этого, если бы я не использовал контейнер МОК, таким образом, должен быть некоторый путь вокруг этого.

Пример кода:

class MyModule : NinjectModule 
{
    public override void Load() 
    {
        Bind<Person>().ToSelf();
        Bind<IAlgorithm>().To<TestAlgorithm>();
        Bind<IAlgorithm>().To<ProductionAlgorithm>();
    }
}

Человек должен использовать оба алгоритма, таким образом, я могу переключиться во время выполнения. Но только TestAlgorithm связывается, поскольку это - первое в контейнере.

6
задан Lazer 26 June 2010 в 11:56
поделиться

2 ответа

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

Стандартное решение DI , когда вам нужно сопоставить экземпляр времени выполнения с зависимостью, заключается в использовании абстрактной фабрики .

Вместо того, чтобы регистрировать отдельные стратегии в контейнере, вы регистрируете фабрику.

Вполне возможно написать полный API так, чтобы он был дружественным к DI, но по-прежнему не зависел от контейнера DI .

6
ответ дан 10 December 2019 в 02:46
поделиться

Если вам нужно изменить реализацию IAlgorithm во время выполнения, вы можете изменить Человеку требуется фабрика алгоритмов , которая предоставляет различные конкретные алгоритмы в зависимости от условий выполнения.

Некоторые контейнеры внедрения зависимостей позволяют вам связываться с анонимными делегатами создания - если Ninject поддерживает это, вы можете поместить логику принятия решения в один из них.

3
ответ дан 10 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: