2009-10-29 3 views
1

Отказ от ответственности: Я довольно новичок в DDD и связанной с ним терминологии, поэтому, если я неправильно использую какие-либо понятия, пожалуйста, исправьте меня.Должен ли репозиторий отвечать за «сглаживание» домена?

В настоящее время я работаю на сайте с относительно простой модели предметной области (элементы каталога, каждый из которых хранит коллекцию CatalogImage предметов.)

Моего репозитория следует стандартному интерфейсу FindbyID(int ID)GetAll() ... и т.д.

Проблема возникает при попытке найти конкретное изображение по его идентификатору; Я в конечном итоге с такими методами, как FindImagebyID(int CatalogItemID, int ImgID)

По мере развития новых ПРЕДПИСАНИЯ, и объектный граф становится более сильно вложенной, я мог видеть взрыв методов, таких как Find{NestedType}ByID(int catalogItemID,.....,int nestedTypeID)

Должен ли я просто возвращая IEnumerable из FindAll() и используя Linq на более высоком уровне для формирования этих запросов? Или это будет нарушением SoC?

ответ

2

Звучит так, как будто у вас есть обоснование для создания нескольких хранилищ.

Пример

interface CatalogRepository 
{ 
    Catalog FindByID(int ID); 
} 

interface CatalogImageRepository 
{ 
    CatalogImage FindByID(int ID); 
} 

Это будет правильно разделить ваши проблемы, поскольку каждое хранилище отвечает только зная, как справиться с этой конкретной организации.

+0

Я действительно согласен с вашим ответом, просто интересно, если сущность/модель просто велика? – CSharpAtl

+0

Мне нравится общий подход, но как метод FindByID CatalogImageRepository знает, к какому элементу каталога относится изображение? – gn22

+0

@CSharpAtl Я не уверен, что это вопрос о том, насколько велика модель. Я думаю, что это скорее вопрос о том, как OP планирует запросить DAL. Если он всегда будет запрашиваться таким же образом (т. Е. FindById и т. Д.), То я думаю, что он в порядке, чтобы продолжать свой путь. Однако, если он начнет идти по пути динамического запроса, я думаю, что реализация Command Query Separation может быть лучшим способом, но в этом случае весь дизайн должен быть изменен. – Joseph

0

Я бы отфильтровал модель на уровне над репозиторием, используя LINQ, если хотите. Делает репозиторий простым. Если вы используете LINQ для получения данных из базы данных, этот метод работает очень хорошо, если вам приходится использовать ADO или какой-либо другой уровень доступа к устаревшим данным, чем это может затруднить сделать репозиторий настолько простым. Linq упрощает работу с возвратом хранилища IQueryable и добавляет фильтрацию следующего слоя, и фактическое извлечение данных происходит не до тех пор, пока его не попросят. Это позволяет использовать метод в репозитории, таком как GetImages(), который получает все изображения, а следующий слой добавляет фильтрацию для определенного изображения. Если вы используете ADO, вы, вероятно, не захотите возвращать все изображения, а затем фильтровать ... так что это может быть компромисс.

Смежные вопросы