acaba de crear un CAC sobre SO preguntar esto :)En un enfoque DDD, ¿este ejemplo está modelado correctamente?
Asumiendo que este ejemplo simplificado: la construcción de una aplicación web para la gestión de proyectos ...
La aplicación tiene los siguientes requisitos/reglas.
1) Los usuarios deberían poder crear proyectos insertando el nombre del proyecto.
2) Los nombres de los proyectos no pueden estar vacíos.
3) Dos proyectos no pueden tener el mismo nombre.
Estoy usando una arquitectura de 4 capas (interfaz de usuario, aplicación, dominio, infraestructura).
En mi capa de aplicación tengo la siguiente clase ProjectService.cs:
public class ProjectService
{
private IProjectRepository ProjectRepo { get; set; }
public ProjectService(IProjectRepository projectRepo)
{
ProjectRepo = projectRepo;
}
public void CreateNewProject(string name)
{
IList<Project> projects = ProjectRepo.GetProjectsByName(name);
if (projects.Count > 0) throw new Exception("Project name already exists.");
Project project = new Project(name);
ProjectRepo.InsertProject(project);
}
}
En mi Capa de Dominio, tengo la clase Project.cs y la interfaz IProjectRepository.cs:
public class Project
{
public int ProjectID { get; private set; }
public string Name { get; private set; }
public Project(string name)
{
ValidateName(name);
Name = name;
}
private void ValidateName(string name)
{
if (name == null || name.Equals(string.Empty))
{
throw new Exception("Project name cannot be empty or null.");
}
}
}
public interface IProjectRepository
{
void InsertProject(Project project);
IList<Project> GetProjectsByName(string projectName);
}
En mi Capa de infraestructura, tengo la implementación de IProjectRepository que hace la consulta real (el código es irrelevante).
No me gustan dos cosas acerca de este diseño:
1) He leído que las interfaces de repositorio debe ser una parte del dominio, pero las implementaciones no debería. Eso no tiene sentido para mí, ya que creo que el dominio no debe llamar a los métodos de depósito (ignorancia de persistencia), que debería ser una responsabilidad de los servicios en la capa de aplicación. (Algo me dice que estoy terriblemente mal.)
2) El proceso de creación de un nuevo proyecto implica dos validaciones (no nulo ni duplicado). En mi diseño anterior, esas dos validaciones están dispersas en dos lugares diferentes, lo que hace que sea más difícil (yo) ver qué está pasando.
Entonces, mi pregunta es, desde una perspectiva DDD, ¿está modelado correctamente o lo haría de otra manera?
En cuanto a (1), creo que mi capa de aplicación podría servir al propósito de una capa de servicio, si tuviera otra capa Creo que podría terminar con capas que no tienen sentido o responsabilidades están compartidas entre las capas. Cuando habla de la complejidad del diseño, estoy totalmente de acuerdo con usted. He estado usando un enfoque de 'Patrón de registros activo' para la mayoría de mis aplicaciones, y ese patrón puede parecer más adecuado para resolver este ejemplo. A propósito, dejé este ejemplo simplista, pero estoy intentando aprender a modelar correctamente utilizando un Patrón de repositorio, por eso me inclino por el patrón AR. – Tag
Con respecto a (2), su sugerencia tiene mucho sentido para mí y creo que, de hecho, es la mejor opción en este caso. – Tag