Ответ 1
Да, DbContext
представляет собой Единицу работы, а DbSet
представляет репозиторий, но некоторые люди создадут над ними слой абстракции. Вот несколько причин, по которым люди могут это сделать:
- Возможно, они не хотят, чтобы их проект был тесно связан с Entity Framework и его архитектурой. Таким образом, они скрывают Entity Framework за этими абстракциями, поэтому они могут заменить Entity Framework для любого другого ORM без каких-либо изменений интерфейса интерфейса доступа к данным.
- Они используют репозитории, чтобы дать понять, какие операции разрешены для определенных объектов. (Например,
CustomerRepository
может позволить добавлять и обновлять клиентов, но не удалять их). С другой стороны, он позволяет разработчику клиента легко распознавать доступные операции для определенных объектов. Другими словами, они создают репозитории с соглашениями об именах и интерфейсами, которые совместимы с языком домена. - Перемещение операций, связанных с базой данных, в репозитории позволяет перехватывать эти операции и выполнять ведение журнала, настройку производительности или любую другую операцию, которую вы хотите.
- Некоторые делают это, чтобы упростить тестирование. Скажем, у меня есть интерфейс
ICustomerRepository
с тремя методами. Тогда я могу легко высмеять это, вместо того, чтобы издеваться надIDbSet<Customer>
со слишком многими методами. - Наконец, есть много тех, кто не создает абстракцию над
DbContext
иDbSet
. Они просто используют их напрямую, и это совершенно верно для этого.