Estoy implementando el patrón de diseño del constructor para construir diferentes tipos de objetos de gráfico que se mostrarán en una interfaz de usuario de WPF. Estoy usando Ninject como mi contenedor IOC. Sin embargo, estoy tratando de encontrar una solución extensible elegante.Inyectar diferentes clases que implementan la misma interfaz utilizando Ninject
Tengo un objeto ChartDirector
que toma un IChartBuilder
como una dependencia. También tengo TemperatureChartBuilder
y ThresholdChartBuilder
que implementan IChartBuilder
. Quiero inyectar TemperatureChartBuilder
O ThresholdChartBuilder
en ChartDirector
dependiendo de un evento que se dispare o dependiendo de una llamada del cliente. He ilustrado mi problema a continuación en el código.
// ChartDirector also depends on this
kernel.Bind<IExample>().To<Example>();
// when called in Method X...
kernel.Bind<IChartBuilder>().To<TemperatureChartBuilder>();
// when called in Method Y...
kernel.Bind<IChartBuilder>().To<ThresholdChartBuilder();
// TemperatureChartBuilder is a dependency of ChartDirector, need a way to dynamically
// allocate which binding to use.
var director = kernel.Get<ChartDirector>();
// without Ninject I would do
var director = new ChartDirector(new TemperatureChartBuilder);
// or
var director = new ChartDirector(new ThresholdChartBuilder);
EDIT:
Junto con la respuesta de Gary, y observando una ligera edición que ChartDirector tiene otra dependencia, ahora quiero hacer algo como esto:
var director = kernel.Get<ChartDirector>().WithConstructorArgument(kernel.Get<IChartBuilder>("TemperatureChart"));
Es algo como esto sea posible ?
+1 como muy útil. Una cosa que no mencioné en mi pregunta original fue que ChartBuilder tiene otras dependencias especificadas durante la inicialización de la aplicación, por lo tanto ninject inyecta automáticamente las otras dependencias requeridas cuando llamo kernel.Get. Entonces, ¿hay alguna manera de hacer lo que sugeriste con 'kernel.Get ' e inyectar el chartbuilder correcto para cada Get específico? –
Seth
@Seth: puede considerar crear dos módulos de ninject diferentes que contengan solo los enlaces específicos que desea resolver: https://github.com/ninject/ninject/wiki/Modules-and-the-Kernel. También echaré un vistazo al modelo dinámico de fábrica/proveedor que proporciona ninject: https: // github.com/ninject/ninject/wiki/Proveedores, -Fáctory-Methods-and-the-Activation-Context –
puede ver mi edición - No estoy seguro de si sus sugerencias en su último comentario abordan el último componente de mi pregunta. . Aprecio tu ayuda hasta el momento :) – Seth