У меня есть класс, который испытывает необходимость для использования шаблона разработки стратегии. Во время выполнения я обязан переключать различные алгоритмы в и видеть эффекты на производительность приложения.
Рассматриваемый класс в настоящее время берет четыре параметра в конструкторе, каждый представляющий алгоритм.
Как с помощью Ninject (или обобщенный подход) я мог все еще использовать МОК, но использовать стратегическую модель?
Текущее ограничение - то, что мое ядро (контейнер) знает о каждом интерфейсе алгоритма, но это может только быть связано с одним реальным классом. Единственным путем вокруг этого, которое я вижу в данный момент, является передача во всех восьми алгоритмах в конструкции, но используйте различные интерфейсы, но это кажется полностью uncessary. Я не сделал бы этого, если бы я не использовал контейнер МОК, таким образом, должен быть некоторый путь вокруг этого.
Пример кода:
class MyModule : NinjectModule
{
public override void Load()
{
Bind<Person>().ToSelf();
Bind<IAlgorithm>().To<TestAlgorithm>();
Bind<IAlgorithm>().To<ProductionAlgorithm>();
}
}
Человек должен использовать оба алгоритма, таким образом, я могу переключиться во время выполнения. Но только TestAlgorithm связывается, поскольку это - первое в контейнере.
Давайте сделаем шаг назад и рассмотрим картину немного шире. Поскольку вы хотите иметь возможность переключать Стратегию во время выполнения, должен быть какой-то механизм сигнализации, который сообщает Person о переключении Стратегии. Если ваше приложение управляется пользовательским интерфейсом, возможно, есть кнопка или раскрывающийся список, где пользователь может выбрать, какую стратегию использовать, но даже если это не так, какой-то внешний вызывающий должен сопоставить часть данные времени выполнения в экземпляр стратегии.
Стандартное решение DI , когда вам нужно сопоставить экземпляр времени выполнения с зависимостью, заключается в использовании абстрактной фабрики .
Вместо того, чтобы регистрировать отдельные стратегии в контейнере, вы регистрируете фабрику.
Вполне возможно написать полный API так, чтобы он был дружественным к DI, но по-прежнему не зависел от контейнера DI .
Если вам нужно изменить реализацию IAlgorithm
во время выполнения, вы можете изменить Человеку
требуется фабрика алгоритмов , которая предоставляет различные конкретные алгоритмы в зависимости от условий выполнения.
Некоторые контейнеры внедрения зависимостей позволяют вам связываться с анонимными делегатами создания - если Ninject поддерживает это, вы можете поместить логику принятия решения в один из них.