Acabo de leer el artículo this sobre el patrón MVVMC. Ahora tengo una pregunta. ¿Debería inyectarse Controller a ViewModel, o ViewModel debe ser inyectado en Controller?Implementación de MVVMC e Inyección de Dependencia
Respuesta
El ViewModel es un contrato entre la Vista y el Controlador, y lo ideal es que no necesite conocer (dependa de) tampoco.
Así que definitivamente no estaría inyectando un Controlador en un ViewModel.
No estoy seguro de que haga lo contrario: el controlador es normalmente responsable de crear nuevas instancias de ViewModel. Si desea una implementación más flexible, puede optar por inyectar una fábrica abstracta en el Controlador, para evitar crear directamente nuevas instancias de sus clases de ViewModel.
Pero cuando inyecte Controller en ViewModel, seguirá siendo un patrón MVVM, de hecho. El controlador tiene toda la lógica, que se proporciona (en una clase de controlador) para ver el modelo. Hay muchos servicios inyectados en el controlador. ¿Está mal? –
Depende de lo que esté haciendo. Voy a adivinar que la mayoría de las veces el Controlador no necesitaría ser inyectado en ninguna de las dos, pero si es necesario, es más probable que sea necesario en ViewModel. Dejame explicar.
¿Qué estás haciendo con el controlador? Debe estar haciendo algo ... Si ese "algo" está relacionado únicamente con "a qué se parecen los datos", entonces pertenece a la Vista. Si está relacionado con "lo que se muestra al usuario", entonces pertenece al ViewModel.
Estoy inyectando un controlador en uno de mis ViewModels. Mi ViewModel representa datos que luego se grafican en la Vista. Tengo un comando que mueve un elemento de datos del gráfico actual a un nuevo gráfico. Como esto cambia "lo que se muestra en la ventana del gráfico", implementé el comando en mi ViewModel. ViewModel elimina el elemento de datos de su propia colección de elementos y luego usa el controlador para solicitar que se cree una nueva vista para esos datos nuevos (ya tenía esta funcionalidad).
Mirando el artículo, no veo flechas entre el controlador y la vista
El MVVMC es simplemente una MVC donde la vista se sustituye por un par modelo de vista.
- La vista interactúa ÚNICAMENTE con ViewModel aprovechando los poderosos mecanismos de enlace de datos en las tecnologías basadas en XAML.
- El ViewModel puede notificar al controlador pero NUNCA DEBE inyectar un controlador.
He reunido una muestra simple basada en la muestra bien conocida de Josh Smith en MSDN ... donde he presentado un controlador.
Creo que el controlador debe ser inyectado como una abstracción IController. ViewModel necesita IController para poder navegar a una vista/modelo de vista diferente.
Por ejemplo, en ViewModel:
IController _controller;
public MyViewModel(IController controller){
_controller = controller;
}
void NavigateHome();
{
_controller.NavigateHome();
}
La abstracción IController es mejor que inyectar el propio controlador por estas razones:
- Testabilidad. Puede inyectar un IController simulado y probar ViewModel
- Desacoplamiento. ViewModel no tiene que saber Controlador.
Desarrollé un marco liviano para hacer MVVMC en WPF. Tiene mucha semejanza con MVC en Asp.NET Core.
Échale un vistazo si estás buscando una solución WPF.
Blog post con la documentación: http://michaelscodingspot.com/2017/02/15/wpf-page-navigation-like-mvc-part-2-mvvmc-framework/
- 1. ASP.NET MVC: HTTPContext e Inyección de Dependencia
- 2. Inyección de Dependencia wcf
- 3. interfaces de inyección e inicio de sesión de dependencia
- 4. Patrón de estrategia e inyección de dependencia usando Unity
- 5. PHP Objetos de carga diferida e inyección de dependencia
- 6. Pruebas de integración NUnit e inyección de dependencia
- 7. C# D a constructor e inyección de dependencia
- 8. alternativas de inyección de dependencia
- 9. Inyección de dependencia en MVC
- 10. Inyección de Dependencia con PowerShell
- 11. Inyección de dependencia sin marco
- 12. Inyección de dependencia con Jersey
- 13. Inyectando el Inyector de Dependencia usando la Inyección de Dependencia
- 14. Inyección de dependencia C#: cómo inyectar una dependencia sin fuente?
- 15. Inyección de dependencia con interfaces o clases
- 16. bibliotecas de inyección de dependencia de Ruby
- 17. La inyección de dependencia y la fábrica
- 18. Mejores prácticas de inyección de dependencia
- 19. Marco de inyección de dependencia mono compatible
- 20. Inmutabilidad después de inyección de dependencia, inicialización
- 21. Marcos de inyección de dependencia: ¿Cómo funcionan?
- 22. Al implementar la inyección de dependencia, ¿deberían incluirse excepciones?
- 23. Dependencia Inyección a los módulos
- 24. Unity [dependencia] inyección y Herencia
- 25. Localizador de servicios, Inyección de dependencia (y contenedor) e Inversión de control
- 26. Registro, Programación Orientada a Aspectos e Inyección de Dependencia - Intentando darle sentido a todo
- 27. resolviendo dependencias circulares con inyección de dependencia
- 28. Burlarse sin IoC o Inyección de Dependencia
- 29. ¿Existe inyección de dependencia en Rails?
- 30. Usar la inyección de dependencia para Properties.Settings.Default?
Tal vez estoy pasado de moda, pero lo que realmente necesita este patrón? No estaba muy impresionado con la justificación hecha por el autor en el artículo vinculado. Parecía estar programando para el "qué pasaría si" en lugar del "ahora mismo" que viola el principio de YAGNI. Algunas de las afirmaciones fueron un poco extremas también. Cada vez que agregue otra capa de abstracción (y esta es solo la capa de UI de la que estamos hablando), la complejidad de la solución aumenta. Solo espero el día en que tengamos MVVMCMVPVMVC ... para dibujar un control. –
¿Qué hay del desorden en un código de ViewModel? –
Supongo que depende de cómo se defina "desastre". ¿Tiene un problema específico que está resolviendo con la adición de un controlador? –