6

No estoy seguro de que las superficies TPL sean suficientes para que esto sea viable, y como tal, siéntase libre de señalar patrones alternativos que funcionen en su lugar. :)ninject (u otra IoC) con alcance de Tarea?

Estoy tratando de averiguar si puedo usar Ninject para las dependencias inyectadas por ctor que, idealmente, deberían tener un alcance para una instancia de tarea raíz/principal particular.

Es algo similar al alcance de la solicitud asp.net, pero en este escenario, es una aplicación de consola que crea N tareas diferentes que se ejecutarán en paralelo. Me pregunto si existe la posibilidad de hacer que Ninject ejecute la inyección de dependencia en tiempo de ejecución en función de cada una de esas instancias raíz de tareas, de modo que el gráfico objeto creado como parte de cada tarea comparta las mismas instancias de una interfaz dada, pero las diferentes tareas tener instancias separadas.

Gracias!

[EDIT] seguir buscando, parece que el InNamedScope podría ser la respuesta correcta en base a la descripción de "definen que los objetos son las posibilidades de sus dependencias"

+1

Si entiendo correctamente su pregunta, 'InNamedScope' es una buena opción. La otra alternativa es 'InCallScope'. Esta [publicación de blog] (http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/) tiene una buena discusión de las diferencias. – neontapir

+0

@neontapir - He hecho algunas pruebas y parece que InNamedScope me hará bien. Si puede agregar una respuesta que diga lo mismo que su comentario, lo aceptaré felizmente. :) –

+0

Un moderador convirtió mi respuesta a un comentario. Recrearé la respuesta. – neontapir

Respuesta

4

Si entiendo su pregunta correctamente, InNamedScope es una buena opción. La otra alternativa es InCallScope. Este blog post tiene una buena discusión de las diferencias:

El alcance llamada le permite definir en una unión que el objeto creado por la unión es la posibilidad de otros objetos que forman parte del árbol objeto que se inyecta en el objeto creado.

Veamos cómo funciona esto en un ejemplo. Imagínese que está creando un Excel como aplicación que tiene varias hojas de cálculo ....

const string ScopeName = "ExcelSheet"; 
Bind<ExcelSheet>().ToSelf().DefinesNamedScope(ScopeName); 
Bind<SheetPresenter>().ToSelf(); 
Bind<SheetCalculator>().ToSelf(); 
Bind<SheetDataRepository>().ToSelf().InNamedScope(ScopeName); 

Aquí, el SheetDataRepository utiliza el ExcelSheet que está en su alcance. El artículo explica en mayor detalle.

Cuestiones relacionadas