Просто создал acc on 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, это правильно смоделировано или вы сделаете это по-другому?