Чем отличается репозиторий от сервиса?

105

В чем разница между репозиторием и сервисом? Кажется, я этого не понимаю.

Я говорю о доступе к данным через уровень доступа к данным, обычно с linq to sql.

Очень часто я вижу репозитории с простыми методами CRUD и службы с методами, более специфичными для бизнеса.

Мы можем взять это сообщение в блоге в качестве примера. Если посмотреть на интерфейсы внизу (изображения), у него два репозитория и две службы. Как узнать, что куда положить?

Как я уже сказал, репозитории, похоже, больше подходят для CRUD-подобных операций, а службы - более ориентированы на бизнес.

Спасибо

Алексей
источник
Вы можете уточнить? В каком контексте? Как и у большинства слов, контекст, в котором используются эти слова, помогает определить их значение.
Дэвид
2
Примечание: я не говорю здесь о веб-сервисах или чем-то подобном. Я говорю о доступе к данным через уровень данных.
Alexn

Ответы:

78

Репозиторий - это, по сути, фасад для сохранения, который использует семантику стиля коллекции (Добавить, Обновить, Удалить) для предоставления доступа к данным / объектам. Это способ отделить способ хранения данных / объектов от остальной части приложения.

Служба обеспечивает координацию или другие «службы», необходимые для работы вашего приложения. Они сильно отличаются тем, что Службы обычно не знают, как получить доступ к данным из постоянства, а репозитории обычно имеют доступ только к данным / объектам для любых служб, которые могут быть у вас.

Jlembke
источник
19
Я бы сказал, что репозиторий - это тип сервиса, который используется для доступа к данным.
Ян Рингроуз,
5
Это прекрасное определение в том смысле, что почти все, что мы пишем, является «службой» на каком-то уровне, но при этом теряется основная идея о том, что репозиторий должен быть набором объектов.
jlembke
4
Если вы попробуете модульное тестирование, будет понятнее думать о репозиториях как о минимальной абстракции, чтобы свести к минимуму насмешки, необходимые для предотвращения базы данных.
Генри Хейккинен
repository= collectionот backbone.jsили repository= serviceот angular?
slideshowp2
160

Репозиторий - это место, где хранятся данные. Сервис - это то, что манипулирует данными.

При сравнении реальной ситуации, если ваши деньги хранятся в хранилище в банке, хранилище является хранилищем. Кассир, который вносит, снимает и т. Д., Является службой.

Дэвид
источник
7
Спасибо за этот ответ! Просто и лаконично.
Alexn
1
согласен с приведенным выше комментарием! Мне также нравится объяснение реального мира!
Kleigh
6
мм. поэтому, если банк решит избавиться от хранилища и положить деньги под матрасы, кассир по-прежнему будет взаимодействовать с вами, как и раньше, без необходимости узнавать об изменении уровня репозитория.
Деннис
1
Я подозреваю, что заказчик захочет узнать об этой реализации, @Dennis
Chucky
1
@ Деннис Да. На самом деле это одно из основных преимуществ использования шаблона репозитория. Вы должны иметь возможность изменять фактическую реализацию интерфейсов репозитория, ничего не меняя в службе. Это дает огромные преимущества для модульного тестирования и делает ваш код слабосвязанным.
Уоррен Паркс
12

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

  • хранилище , где вы размещаете некоторые глобальные объекты, которые будут использоваться в дальнейшем.
  • услуга является код бизнес - логики, очевидны (и в идеале отделена от слоя презентации и уровень базы данных?)
KLE
источник
3
Было бы нормально сделать следующее: в моем репозитории есть все мои сложные вызовы базы данных, затем в моем сервисе я вставляю репозиторий в качестве зависимости. Теперь у меня есть легко тестируемый код и я разделил свои проблемы, потому что моя служба не знает, как выполняются вызовы БД, а просто вызывает функции репозитория, который это делает. Поэтому бизнес-логика и доступ к данным разделены. Будет ли это жизнеспособным подходом?
darophi
1
Если вся логика прописана в сервисах, то контроллер будет вызывать только сервис?
Исломходжа Хамидуллаходжаев