Просто создал акк на SO, чтобы спросить это:)
Предполагается, что этот упрощенный пример: создание веб-приложения для управления проектами ...
Приложение имеет следующие требования / правила.
1) Пользователи должны иметь возможность создавать проекты, вставляя имя проекта.
2) Имена проектов не могут быть пустыми.
3) Два проекта не могут иметь одинаковое имя.
Я использую 4-уровневую архитектуру (пользовательский интерфейс, приложение, домен, инфраструктура).
На моем уровне приложений у меня есть следующий класс 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);
}
}
На моем уровне домена у меня есть класс Project.cs и интерфейс 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);
}
На моем уровне инфраструктуры у меня есть реализация IProjectRepository, которая выполняет фактические запросы (код не имеет значения).
Мне не нравятся две вещи в этом дизайне:
1) Я читал, что интерфейсы репозитория должны быть частью домена, но реализации не должны. Это не имеет смысла для меня, так как я думаю, что домен не должен вызывать методы хранилища (постоянное невежество), это должно быть ответственностью служб на прикладном уровне. (Что-то говорит мне, что я ужасно неправ.)
2) Процесс создания нового проекта включает в себя две проверки (не нулевые и не дублирующие). В моем проекте выше эти две проверки разбросаны в двух разных местах, что усложняет (imho) видеть, что происходит.
Итак, мой вопрос, с точки зрения DDD, это правильно смоделировано или вы сделали бы это по-другому?