Soy nuevo en este concepto de diseño completo, y en la lectura de las últimas semanas he reunido mucha información, pero parece estar dispersa y en conflicto. Los términos son mixtos, y solo estoy teniendo dificultades para pensar en esto.Aplicación MVC3/Capa de servicio/Capa de repositorio/Clases de POCO/EF4 - ¡Preguntas!
El patrón que estoy usando es como este y asumen el flujo como sigue:
Aplicación MVC
El controlador (s) procesar la petición/respuesta desde el cliente para una vista determinada. Dentro de los métodos de acción de los controladores, se ponen en contacto con los servicios (Capa de servicio) y solicitan objetos para construir los modelos de vista y devuelven los objetos de los modelos de vista.
Visualización de modelos
estoy usando modelos de vista inflexible hacia y desde los puntos de vista.
¿Están los modelos de visualización DTO? Deberían contener solo propiedades simples como Nombre, AddressLine1, Address City, etc., o deberían contener propiedades complejas, múltiples objetos, etc.
Es la validación en el modelo de vista. De ser así, sería una validación como los campos obligatorios, la longitud del campo, etc. Entonces, la validación como nombre de usuario ya existe, o donde necesitaría interactuar con otros objetos en la capa de servicio.
¿Pueden los modelos de vista solo contener las clases de POCO devueltas de EF, o debería usar AutoMapper?
Si usa AutoMapper y DTO, ¿son los clones de DTO de las clases de POCO?
¿Podría mapear en el controlador, ver modelo o en la capa de servicio a continuación?
Servicios
Para mí, el servicio (s) son objetos que entran en contacto con el repositorio (s) para obtener POCO objetos detrás de la EF. Aquí es donde está toda mi lógica comercial. Una vez que el servicio devuelve un objeto a un repositorio para que se conserve en el EF, se consideran objetos válidos. ¿Es esto correcto?
repositorios
No hay ninguna lógica de negocio en ellos, sólo son utilizadas para el transporte de objetos entre el servicio (s) y la EF. ¿Es esto correcto? Estoy implementando interfaces aquí con repositorio genérico. Entonces, ¿podría ampliar el repositorio genérico para necesidades especiales?
preguntas acerca de la terminología
1) ¿Es un objeto de negocio igual a un objeto de dominio? ¿Cuánta lógica debe contener un objeto de dominio?
2) ¿El modelo de dominio es el modelo EF? Estoy usando el enfoque Model-First.
3) Inyección Dependency - ¿Debo utilizar esto? Entiendo cómo funciona, simplemente no obtengo el beneficio real. Estaba jugando con Ninject.
Creo que la comunidad se beneficiaría de algún tipo de wiki que contuviera todas las mejores prácticas con muestras de código. ¿Hay algo así afuera? Muchas de las muestras disponibles son muy simples, y muchas de las muestras de Microsoft no usan este patrón incluso cuando afirman hacerlo.
Gracias de antemano a todos los que me han ayudado y me ayudarán con esto.
BTW - Creo Stackoverflow necesita un poco, botón "cómpreme una cerveza" al lado de la casilla de verificación "Aceptar respuesta" :)
arin - Si usa AutoMapper y DTO, ¿son los clones de DTO de las clases de POCO? Lo que quiero decir con esto es si, por ejemplo, tenía una visión que iba a mostrar la información básica de un cliente con una colección de direcciones y pedidos, asumiría que el modelo de vista tendría las propiedades básicas del cliente y luego una colección de direcciones y pedidos.¿Serán esas colecciones propiedades de los objetos POCO, o necesito crear una clase en la aplicación MVC que imite las clases de orden y dirección del POCO y las use en el modelo de vista? – Sam
@Darin: ¿Está utilizando las clases generadas por POCO de EF usando el enfoque de primer modelo del mismo modo, o cierra también el método de primer código? Las clases de POCO son bastante simples. Eche un vistazo aquí: http://www.striano.net/Customer.vb.txt, ¿está esto contaminado? – Sam
@Sam, si necesitara una vista que mostrara la información básica de un cliente con una colección de direcciones y pedidos, construiría un ClienteViewModel que contendría las propiedades básicas y un 'AddressViewModel' y un' OrderViewModel' que contendría el propiedades que le gustaría mostrar para un cliente determinado acerca de sus direcciones y pedidos y luego el 'CustomerViewModel' podría tener dos propiedades de colección de' AddressViewModel' y 'OrderViewModel'. –