He estado leyendo un poco sobre DDD, y estoy confundido sobre cómo encajaría esto al usar un ORM como NHibernate.¿Se puede utilizar un enfoque DDD puro con NHibernate?
Ahora tengo una aplicación .NET MVC con controladores bastante "gordos", y estoy tratando de encontrar la mejor manera de arreglar eso. Mover esta lógica de negocios a la capa de modelo sería la mejor manera de hacerlo, pero no estoy seguro de cómo hacerlo.
Mi aplicación está configurada para que la sesión de NHibernate sea administrada por un HttpModule (obtiene sesión/transacción fuera de mi camino), que es utilizada por repositorios que devuelven los objetos de entidad (Think S # arp arch ... resulta una gran parte de su funcionalidad realmente duplicada en esto). Estos repositorios son utilizados por DataServices, que en este momento son solo envoltorios alrededor de los repositorios (mapeo uno a uno entre ellos, por ejemplo, UserDataService toma un UserRepository, o en realidad un repositorio). Estos DataServices en este momento solo aseguran que las anotaciones de datos que decoran las clases de entidades se verifiquen al guardar/actualizar.
De esta manera, mis entidades son realmente solo objetos de datos, pero no contienen ninguna lógica real. Si bien podría poner algunas cosas en las clases de entidad (por ejemplo, un método de "aprobación"), cuando esa acción necesita hacer algo como enviar un correo electrónico, o tocar otros objetos no relacionados, o, por ejemplo, verificar para ver si hay usuarios que tienen el mismo correo electrónico antes de aprobar, etc., entonces la entidad necesitaría acceder a otros repositorios, etc. Inyectarlos con un IoC no funcionaría con NHibernate, por lo que tendría que usar una fábrica patrón que estoy asumiendo para obtener estos. Sin embargo, no veo cómo te burlarías de esos en las pruebas.
Así que la siguiente forma más lógica de hacerlo, creo, sería esencialmente tener un servicio por controlador, y extraer todo el trabajo que se realiza actualmente en el controlador en los métodos en cada servicio. Sin embargo, creo que esto está rompiendo con la idea de DDD, ya que la lógica ya no está contenida en los objetos reales del modelo.
La otra forma de ver eso, supongo, es que cada uno de esos servicios forma un único modelo con el objeto de datos contra el que funciona (Separación de campos de almacenamiento de datos y la lógica que opera sobre él), pero solo quería para ver lo que otros están haciendo para resolver el problema del "controlador de grasa" con DDD al usar un ORM como NHibernate que funciona devolviendo objetos de datos poblados y el modelo de repositorio.
Actualizado Creo que mi problema es cómo estoy mirando esto: NHibernate parece poner los objetos de negocio (entidades) en la parte inferior de la pila, que repositorios luego actuar sobre. Los repositorios son utilizados por servicios que pueden usar repositorios múltiples y otros servicios (correo electrónico, acceso a archivos) para hacer cosas. Es decir: Aplicación> Servicios> Repositorios> Objetos comerciales
El enfoque DDD puro que estoy leyendo parece reflejar un sesgo de registro activo, donde las funciones CRUD existen en los objetos comerciales (esto lo llamo User.Delete directamente en lugar de Repository.Delete de un servicio), y el objeto de negocio real maneja la lógica de las cosas que se deben hacer en esta instancia (como enviar un correo electrónico al usuario y eliminar archivos que pertenecen al usuario, etc.). Es decir. Aplicación> (Servicios)> Objetos de negocios> Repositorios
Con NHibernate, parece que sería mejor usar el primer enfoque dado la forma en que funciona NHibernate, y estoy buscando confirmación en mi lógica. O si estoy confundido, alguna aclaración sobre cómo se supone que este enfoque en capas funciona. Según entiendo, si tengo un método de "aprobación" que actualiza el modelo de usuario, lo persiste y, por decir algo, envía un correo electrónico a algunas personas, este método debe ir al objeto de entidad de usuario, pero para permitir el IoC adecuado para que pueda Inyectar el servicio de mensajería, necesito hacer esto en mi capa de servicio en lugar de hacerlo en el objeto Usuario.
Desde el punto de vista de "IU múltiple" esto tiene sentido, ya que la lógica de hacer las cosas se saca de mi capa de interfaz de usuario (MVC) y la pongo en estos servicios ... pero básicamente solo estoy factorizando lógica a otra clase en lugar de hacerlo directamente en el controlador, y si no voy a tener alguna otra IU involucrada, entonces acabo de cambiar un "controlador de grasa" por un "servicio gordo", ya que el servicio es esencialmente va a encapsular un método por acción de controlador para hacer su trabajo.
No estoy seguro de qué "enfoque DDD puro" refleja un sesgo de registro activo. Eso es decididamente diferente a todo lo que recuerdo en el libro de Eric Evans. ¿Qué fuente está utilizando que sugiere que las entidades usen ActiveRecord? – JasonTrue
Por lo que vale, puede usar Castle ActiveRecord si quiere que Nhibernate use ActiveRecord en lugar de un enfoque DDD. – JasonTrue