Могут ли сущности получать доступ к репозиториям?
Нет, пожалуйста, не делай этого.
Во-первых, идея модели предметной области состоит в том, чтобы отделить бизнес-логику от приложения. Изолируйте его от своей базы данных, репозиториев и вашего приложения. Это позволяет вам хранить бизнес-логику отдельно и позволять тестировать и изменять ее отдельно от вашего приложения.
Домен не должен знать о сохранении данных и должен предполагать, что это происходит автоматически.
ddd-the-repository-pattern. aspx
Во-вторых, есть и другие более практичные причины не внедрять свои репозитории в свои enties.
Ваши объекты должны быть доступны для модульного тестирования, путем внедрения ваших репозиториев в вашу сущность, которую вы создали в зависимости от вашего репозитория.
Использование метода GetInstance () нарушает закон Деметры, вы создаете тесную связь ITaskStatusRepository с вашей сущностью. Это означает, что при создании новой задачи и написании модульных тестов не очевидно, что для задачи требуется ITaskStatusRepository. Это затрудняет модульное тестирование вашей бизнес-логики.
С точки зрения DDD, репозиторий не только связан с взаимодействием с БД, но и может быть получен из хранилища в памяти. Или список.
Ваш репозиторий не должен иметь отношения 1 к 1 с таблицами. Если вам нужно, чтобы репозиторий задач выполнял внутренние соединения с другими таблицами для выполнения сложных запросов, и он возвращает список элементов задач, тогда вы предоставляете метод из своего репозитория, который выполняет этот запрос. (Я думаю, что это распространенное заблуждение относительно шаблона репозитория).
Ваши сущности не должны беспокоиться о выполнении действий с базой данных.
См. Изображение, размещенное здесь:
DDD: как следует организовать слои?
public class TaskStatus
{
public long Id { get; set; }
public string Description { get; set; }
public TaskStatus() {
Description = "Incomplete";
}
}
public class Task
{
public long Id {get;set;}
public string Description {get;set;}
public TaskStatus Status {get;set;}
public void CompleteTask()
{
Status.Description = "Complete";
}
}
Внутри уровня приложения ваш репозиторий отвечает за сохранение (или нет). Репозиторий - это Список ‹> совокупных корней. И это работает на общем корневом уровне.
Пример использования ваших Задач внутри TaskService. Служба воздействует на сущности на уровне вашего приложения.
public class TaskService
{
private readonly ITaskRepository _taskRepository;
public TaskService(ItaskRepository taskRepository){
_taskRepository = taskRepository;
}
public List<Task> CompleteAllTasks()
{
List<Tasks> getTasks = _taskRepository.GetTasks();
getTasks.ForEach(CompleteTask);
return _taskRepository.Save(getTasks);
}
}
person
Justin Shield
schedule
04.07.2011