Мы работаем над новым проектом (переписывая существующее приложение), и у меня возникают проблемы с моей моделью предметной области/дизайном репозитория.
Вот (упрощенная) версия двух ключевых частей нашей модели предметной области:
Как видите, у меня есть абстрактная концепция публикации, которая может включать в себя такие вещи, как обзор, обсуждение, фото, видео и т. д. Сообщения также могут содержать комментарии.
У меня также есть абстрактное понятие Местоположение, которое, очевидно, представляет собой такие вещи, как улицы, города, районы и т. д.
Это, естественно, выглядело для меня как два четких совокупных корня.
Поэтому я создал два репозитория, один из которых называется PostRepository, а другой называется LocationRepository.
Все это работало нормально, я могу добавить/получить любой тип сообщения (или комментария) и добавить/получить любой тип местоположения через один из этих двух репозиториев.
Но теперь я в сценарии «посадочной страницы» для города (например).
На этой странице мне нужно в основном показать «все сообщения для этого места».
Как это определяется? Что ж, сообщение может быть (необязательно) помечено как местоположение. Детали реализации, поэтому я не хочу слишком углубляться в данные (поскольку это не то, о чем DDD), но, по сути, существует геопространственный интеллект для определения того, какие сообщения содержатся в определенном месте с помощью шейп-файла местоположения, и широта/долгота помеченного поста.
Но как я могу получить эту информацию, не пересекая границы?
Какой репозиторий я использую? Мне нужен новый?
Если это имеет значение (или для любопытных), это веб-приложение (ASP.NET MVC) с базой данных SQL Server 2008 и Entity Framework 4.0.
Если вам нужны какие-либо разъяснения, дайте мне знать.
ИЗМЕНИТЬ
В настоящее время мы используем модифицированную версию шаблона спецификации для получения моделей предметной области.
Например, это код в нашем BLL для получения всех отзывов, где оценка >= 4:
var reviews = postRepository // GenericRepository<Post>
.Find() // IQueryable<Post>
.OfType<Review>() // IQueryable<Review>
.Where(x => x.Score >= 4)
.ToList(); // List<Review>
Но теперь мне нужен такой код:
var reviews = postRepository
.Find()
.OfType<Review>()
.Where( //lat long, or Locations FK )
.ToList();
Проблема в том, что я не знаю, как выполнить вышеуказанный запрос без добавления промежуточного объекта соединения (LocationPost - как многие ко многим) и добавить к нему FK в модель домена Post.
Но, делая это, я пересекаю совокупные границы, не так ли?