Может ли сущность получить доступ к репозиторию?

Скажем, у меня есть две простые сущности: Пользователь и Обзор. Насколько плохо, если Пользователь вызывает репозиторий обзора? Каким «чистым» способом пользователь может получать свои отзывы?

class User
{
    public function getReviews()
    {
        return reviewRepository.findByUser(this);
    }
}

Я просмотрел этот вопрос, но хотя они говорят, что это плохая практика, я не нашел там ответа.


person BenMorel    schedule 22.07.2011    source источник


Ответы (1)


Чистый способ в DDD - это заставить UserRepository заполнять отзывы пользователя при запросе пользователя.

class UserRepository
{
  public User GetUserByID(long userId)
  {
    var user = CreateUser();
    user.Reviews = FindReviewsforUser(userID);
    return user;
  }
}

Но прежде чем вы это сделаете, вам необходимо убедиться, что ваша пользовательская сущность в вашем домене также является AggregateRoot! Только AggregateRoots имеют репозитории. Прочтите этот вопрос, чтобы увидеть или получить некоторое представление о проблемах. при проектировании агрегатных ботинок.

person rObiwahn    schedule 25.07.2011
comment
вот еще одна полезная ссылка для агрегатов: thinkddd.com/blog / 2009/02/14 / агрегаты-и-агрегатные-корни - person rObiwahn; 25.07.2011
comment
Да, и Пользователь, и Обзор являются совокупными корнями. Мне нравится ваше решение, однако меня беспокоит следующее: поскольку FindReviewsforUser() вызывается только один раз при создании экземпляра пользователя, что произойдет, если мы добавим новый обзор для этого пользователя? User.Reviews будет устаревшим, тогда как он был бы актуальным, если бы мы снова позвонили в Репозиторий. Я что-то упускаю? - person BenMorel; 26.07.2011
comment
Вы никогда не получите полной синхронизации. По крайней мере, не в многоуровневой архитектуре! если бы вы сделали это как user.AddReview (review); ваш пользовательский объект будет синхронизирован (в локальной среде). - person rObiwahn; 29.07.2011