Вы на самом деле правы.DbContext
является реализацией шаблона единицы работы, а IDbSet
является реализацией шаблона репозитория.
В настоящее время репозитории очень популярны и используются слишком часто.Все используют их только потому, что существуют десятки статей о создании хранилища для структуры сущностей, но на самом деле никто не описывает проблемы, связанные с этим решением.
Обычно основными причинами использования хранилища являются:
- СкрытьEF из верхнего уровня
- Сделайте код лучше тестируемым
Первая причина - это некая архитектурная чистота и отличная идея, что если вы сделаете свои верхние уровни независимыми от EF, вы сможете позже переключитьсяв другие постоянные рамки.Сколько раз вы видели такую вещь в реальном мире?По этой причине работа с EF значительно усложняется, поскольку в вашем хранилище должно быть много дополнительных функций, охватывающих то, что EF позволяет по умолчанию.
В то же время перенос кода EF может улучшить организацию вашего кода и следовать правилу разделения интересов.,Для меня это может быть единственным реальным преимуществом репозитория и единицы работы, но вы должны понимать, что следование этому правилу с EF, возможно, сделает ваш код лучше поддерживаемым и лучше читаемым, но при первоначальных усилиях по созданию вашего приложения оно будет намного выше идля небольших приложений это может быть ненужной сложностью.
Вторая причина частично верна.Большим недостатком EF является жесткая архитектура, которую вряд ли можно смоделировать, поэтому, если вы хотите выполнить модульное тестирование верхнего уровня, вы должны каким-то образом обернуть EF, чтобы допустить насмешку над его реализацией.Но это имеет много других последствий, которые я описал здесь .
Я подписан на Блог Айенде .Если вы когда-либо использовали NHibernate, вы, вероятно, знаете его статьи.Этот парень недавно написал несколько статей против использования репозитория с NHibernate, но NHibernate гораздо лучше подшучивает.