Pregunta

Estoy tratando de entender la mejor manera de usar IoC dentro de mi aplicación para la inyección de dependencia, sin embargo, tengo un pequeño problema.

Estoy usando una implementación flexible del patrón MVP con una aplicación WPF. Básicamente, se crea una instancia de una clase de presentador y se inyecta una vista y una tarea (por ejemplo, IEmployeeView e IEmployeeTask for EmployeePresenter) en el presentador.

Me gustaría usar un contenedor de IoC (estoy probando Unity, aunque supongo que esto también sucedería con otros como ninject o Structure Map) en lugar de inyectar manualmente estas instancias, sin embargo, si se crea el presentador (o resuelto desde un contenedor de IoC) en una llamada de delegado asíncrono, o un subproceso de evento (por ejemplo, no subprocesado por STA) y luego creando una nueva instancia de una ventana WPF arroja la siguiente excepción:

  

La operación de compilación actual (clave de compilación   Clave de compilación [ espacio de nombres .Window1, nulo])   fallido: el hilo de llamada debe ser   STA, porque muchos componentes de la interfaz de usuario   requiere esto.

Ahora, sé que las nuevas instancias de ventanas, etc., deben ser STA, sin embargo, ¿es posible usar un Contenedor de IoC para realizar la inyección de dependencia incluso cuando la IU debe crearse en un hilo STA?

Al observar este problema, parecería que la clase / tipo que se está resolviendo se instancia en el momento de la resolución, no cuando está registrada ...

¿Fue útil?

Solución

Yo diría que use una Fábrica para crear los objetos del Presentador; de esa manera, puede crear sus instancias genéricas de Presentadores desde su PresenterFactory en un hilo STA, y luego simplemente pasarlas cuando sea necesario.

Otros consejos

Su problema no tiene nada que ver con IoC, solo se puede acceder a un objeto WPF desde el mismo hilo que lo creó, por lo que debe crear su presentador en el mismo hilo que el resto de su GUI (y no solo cualquier STA hilo).

Use Dispatcher.BeginInvoke para ejecutar el código en el hilo principal y llamar a Ioc contianer desde allí.

Mencionas Unity, ¿has visto usar la Biblioteca de aplicaciones compuestas que también la usa? La aplicación de ejemplo de StockTrader utiliza Unity para inyectar vistas a los modelos de presentación. Si no desea utilizar la CAL, más información: ( http://msdn.microsoft.com/en-us/library/cc707890 .aspx o http://www.codeplex.com/CompositeWPF )

es posible que aún pueda averiguar cómo resolvieron el problema ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top