2010-03-06 17 views
6

Tengo una clase que va a necesitar usar el patrón de diseño de estrategia. En tiempo de ejecución, debo activar y desactivar diferentes algoritmos para ver los efectos en el rendimiento de la aplicación.Patrón de diseño de estrategia con contenedores IOC - Ninject específicamente

La clase en cuestión actualmente toma cuatro parámetros en el constructor, cada uno representa un algoritmo.

¿Cómo usar Ninject (o un enfoque generalizado) podría seguir usando IOC pero usar el patrón de estrategia?

La limitación actual es que mi kernel (contenedor) conoce cada interfaz de algoritmo, pero eso solo puede vincularse a una clase concreta. La única forma de evitar esto que puedo ver en este momento es aprobar los ocho algoritmos en construcción, pero usar interfaces diferentes, pero esto parece totalmente innecesario. No haría esto si no estuviera usando un contenedor de IOC, por lo que debe haber alguna forma de evitar esto.

ejemplo Código:

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

persona tiene que hacer uso de ambos algoritmos para que pueda cambiar en tiempo de ejecución. Pero solo TestAlgorithm está vinculado, ya que es el primero en el contenedor.

Respuesta

6

Demos un paso atrás y examinemos una imagen un poco más grande. Dado que desea poder cambiar la estrategia en tiempo de ejecución, debe haber algún tipo de mecanismo de señalización que le indique a la persona que cambie la estrategia. Si su aplicación está impulsada por la interfaz de usuario, tal vez haya un botón o lista desplegable donde el usuario pueda seleccionar qué estrategia usar, pero incluso si este no es el caso, alguna persona que llame debe map un fragmento de datos en tiempo de ejecución a una instancia de la Estrategia.

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

En lugar de registrar las Estrategias individuales con el contenedor, registra la fábrica.

Es completamente posible escribir una API completa para que sea DI-friendly, but still DI Container-agnostic.

+0

Esto funcionó. Aclamaciones. – Finglas

3

Si necesita variar la aplicación IAlgorithm en tiempo de ejecución, puede cambiar Person a requerir un algoritmo fábrica que proporciona diferentes algoritmos concretos basados ​​en las condiciones de tiempo de ejecución.

Algunos contenedores de inyección de dependencia le permiten enlazar a delegados creacionales anónimos: si Ninject lo admite, podría poner la lógica de decisión en uno de ellos.

Cuestiones relacionadas