Pregunta

En el mundo real, los controladores pueden potencialmente necesidad de utilizar datos de una variedad de tablas de bases de datos y otros almacenes de datos. Por ejemplo:

[Authorize]
    public class MembersController : Controller
    {
        ICourseRepository repCourse;
        IUserCourseRepository repUserCourse;
        IMember member;
        public MembersController(ICourseRepository repCourse, IUserCourseRepository repUserCourse, IMember member)
        {
            this.repCourse = repCourse;
            this.repUserCourse = repUserCourse;
            this.member = member;
        }

Así que:

  1. ¿Debo usar un repositorio para cada tabla?

  2. Creo que aquí es donde el concepto de conglomerados de agregados entra en juego? ¿Debo tener un repositorio por agregado?

  3. No acabo de añadir tantos repositorios mientras que necesito el constructor del controlador?

  4. Es esto una señal de que mi diseño es malo?

NOTA:

La interfaz IMember representa esencialmente un objeto auxiliar que pone una cara agradable en el proveedor de pertenencia. Es decir, se pone todo el código en un solo lugar. Por ejemplo:

        Guid userId;
        public Guid UserId
        {
            get
            {
                if (userId == null)
                {
                    try
                    {
                        userId = (Guid) Membership.GetUser().ProviderUserKey;
                    }
                    catch { }
                }
                return userId;
            }
        }

Uno de los problemas con que es, sin duda el almacenamiento en caché este tipo de salida. Puedo sentir otra pregunta acerca.

EDIT:

Estoy usando Ninject de DI y estoy muy vendido en todo el DI, DDD y TDD cosa. Especie de. También trato de ser un pragmático ...

¿Fue útil?

Solución

  

1. ¿Debo usar un repositorio para cada tabla?

Probablemente no. Si usted tiene un repositorio por mesa, que está haciendo esencialmente Active Record. Yo también prefiero personalmente para evitar llamar a estas clases "depósito", debido a la confusión que puede producirse entre Domain Driven concepto de un "repositorio" y el "repositorio" clase por tabla de diseño que parece haberse convertido comúnmente utilizado con Linq2SQL, SubSonic , etc., y muchos tutoriales MVC.

  

2. supongo que esto es donde el concepto de conglomerados de agregados entra en juego? ¿Debo tener un repositorio por agregado?

Sí y sí. Si va a seguir este camino.

  

'3'. No acabo de añadir tantos repositorios mientras que necesito el constructor del controlador?

No dejo que mis controladores tocan mis repositorios directamente. Y no dejo que mis puntos de vista tocan mis clases de dominio directamente, ya sea.

En lugar de ello, mis controladores tienen clases de consulta que son responsables de devolver Visualización de modelos. La consulta de referencia de clases lo repositorios (u otras fuentes de datos) que necesitan para compilar el Modelo Vista.

Otros consejos

Bien @awrigley, aquí está mi consejo:

Q: ¿Debo usar un repositorio para cada tabla

A:. No, como usted ha mencionado en la pregunta 2. El uso de un repositorio por agregado y llevar a cabo las operaciones en la raíz agregada única

Q:? No acabo de añadir tantos repositorios mientras que necesito el constructor del controlador

R: Creo que estás utilizando COI y constructor de la inyección, así, en este caso, asegúrese de que sólo pasa dependencias reales. este post puede ayudar a decidir sobre este tema.

(! Pst que la captura vacío no es una cosa agradable !!);)

Saludos!

Todo esto depende de cómo "Domain Driven Design" de su va a ser. ¿Sabe lo que es un directorio raíz agregada? La mayoría de las veces una forma genérica mecanografiada repositorio que puede hacer todas sus CRUD básica será suficiente. Su única cuando empieza a tener modelos de espesor con marco y los límites que este comienza a adquirir importancia.

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