6

У меня есть класс, который должен будет использовать шаблон разработки стратегии. Во время выполнения я должен переключать разные алгоритмы, чтобы увидеть эффекты на производительность приложения.Стратегия Дизайн шаблона с контейнерами IOC - специально для Ninject

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

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

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

Пример кода:

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

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

ответ

6

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

standard DI solution when you need to map a run-time instance to a dependency is to use an Abstract Factory.

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

Полностью можно написать полный API так, чтобы он был DI-friendly, but still DI Container-agnostic.

+0

Это сработало. Приветствия. – Finglas

3

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

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