При реализации шаблона репозитория должно ли значение поиска/таблицы получать свой собственный репозиторий?

Я создаю службы RESTful для нескольких объектов базы данных на основе модифицированной версии BISDM. Некоторые из этих сущностей имеют связанные таблицы поиска, как показано ниже:

Фрагмент измененной схемы BISDM

Я решил использовать шаблон репозитория, чтобы обеспечить четкое разделение между сохранением и поиском данных; однако я не уверен, как поиски (в отличие от сущностей) должны быть представлены в репозитории.

Должны ли поисковые запросы иметь свой собственный интерфейс репозитория, «делиться» им со связанным объектом, или должен быть общий интерфейс ILookupRepository?

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

Option 1:
   ISpaceRepository.GetSpaceCategoryById(string id);
Option 2:
   ISpaceCategoryRepository.GetById(string id);
Option 3:
   ILookupRepository.GetSpaceCategoryById(string id);

Кстати, этот вопрос связан с другим, касающимся справочные таблицы и веб-службы RESTful.


person Ryan Taylor    schedule 22.07.2009    source источник


Ответы (1)


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

Одна из вещей, которую вы захотите сделать, это GetSpaceCategories(). Это определенно должно быть включено в репозиторий Spaces, так как любой, кто имеет дело с Spaces, захочет получить доступ к категориям Space без необходимости создавать какой-либо другой репозиторий.

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

person womp    schedule 22.07.2009
comment
При таком подходе UpdateSpaceCategory(SpaceCategory spaceCategory) и DeleteSpaceCategory(string id) также будут в ISpaceRepository, верно? - person Ryan Taylor; 23.07.2009
comment
Для уверенности. Цель репозитория — скрыть базовый доступ к данным. Если бы вы отключили уровень базы данных, остальная часть вашей программы по-прежнему вызывала бы GetCategories() или UpdateCategory() в репозитории — изменение было бы прозрачным для потребителя репозитория. - person womp; 23.07.2009