Pregunta

Estoy desarrollando una aplicación de WPF utilizando el patrón MVVM. Estoy usando la biblioteca MVVM Light y también estoy tratando de utilizar un inyector de dependencia (estoy considerando Ninject y Unidad).

He leído un montón de artículos de blogs y estoy bastante confundido acerca de la manera "correcta" de hacer mis clases se comunican entre sí. En particular, no sé cuándo usar la inyección de dependencias y cuándo confiar en el patrón de mediador.

Vamos a considerar un ejemplo. Tengo un modelo de vista, vamos a llamarlo DataViewModel, y la clase de datos que proporciona algún tipo de datos. ¿Cómo es mejor para comunicarse entre ellos:

A. Inyectar una dependencia a DataViewModel con una interfaz de iData? De esta manera datos no tendrá que depender de Messenger, pero tendrá que proporcionar un evento si cambia los datos y el modelo de vista tendrá que suscribirse a él.

B. Confiar en el patrón de mediador (implementado en MVVM Light como Mensajero) y mensajes enviados entre modelo y modelo de vista? De esta manera, no será necesario el uso de la inyección de dependencias en absoluto, porque la comunicación entera se basa en los mensajes.

dependencias Por otra parte, deberían haber inyectado mis ViewModels en otros ViewModels, o sería mejor simplemente se basan en el Messenger? Si la primera, sería necesario definir una interfaz independiente para cada modelo de vista? Creo que la definición de una interfaz para cada máquina virtual será un trabajo adicional, pero tal vez vale la pena.

¿Fue útil?

Solución

En general, el modelo de vista va a un servicio (como Prisma llama) para recuperar los datos que necesita. Ese servicio es empujado a través del modelo de vista DI (Inyección de Constructor) si bien se puede realizar esto de otra manera a través de un ServiceLocator.

Por lo tanto el modelo de vista llevará a cabo una referencia a un servicio que va a abstraer la recuperación de sus datos. Los datos podrían ser procedentes de una base de datos, archivo XML, quien sabe ... la abstracción es allí. Así que para su caso de iData, la referencia a este tipo ocurrirá en algún momento en el modelo de vista, pero no a través de ninguna de de DI. Si el marco de la COI lo permite (Prisma hace) crear asignaciones de tipos de interfaz a tipos concretos y luego recuperar esos tipos a través de su contenedor; tal es el caso con la Unidad.

Este es un ejemplo breve ... Scripts se une a la vista y el modelo de vista se inyecta en la vista. Observe el uso de la IScriptService para recuperar los datos. Los datos de volver es una colección de tipos iScript, sin embargo, nunca inyectamos formalmente ese tipo en el modelo de vista, ya que no se preocupan por el tipo como una entidad única que nos importa el tipo en una escala grandeza.

        public ScriptRepositoryViewModel(IUnityContainer container, IScriptService scriptService, IEventAggregator eventAggregator)
        {
            _container = container;
            _scriptService = scriptService;
            _eventAggregator = eventAggregator;
        }

        public ICollectionView Scripts
        {
           get 
           {
               if (_view == null)
               {
                   _view = CollectionViewSource.GetDefaultView(_scriptService.Scripts);
                   _view.Filter = Filter;
               }

               return _view;
           }
       }

Cuando usted hace su camino a la Vista, el mismo caso se puede tener allí, la vista conseguirá inyectada a través de DI (Inyección de Constructor) con el modelo de vista. Yo no haría otras ViewModels dependen unos de otros, mantenerlos aislados. Si se empieza a ver una necesidad para el acoplamiento de echar un vistazo a los datos que están tratando de acción, más a menudo entonces a que las necesidades de datos para ser extraída fuera más allá y no se conviertan acoplado a cualquier modelo de vista.

Otros consejos

Hay más de una solución buena a su problema,

Le sugiero que use alguna de las interfaces solo en sus modelos de datos, lo puso en una clase base, esta interfaz le permitirá a su objetos de datos para comunicarse con el mundo exterior.

Para los modelos de vista inyectan no los datos, sino una interfaz que puede recuperar los datos para usted, los datos se exponga hechos que la máquina virtual puede registrar a ellos después de que los sufran.

Los datos oject no debe saber que lo sostiene, vista del modelo sabe qué tipo de datos se lleva a cabo, pero yo no recomiendo para inyectar estos datos debido a problemas de flexibilidad.

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