Ви насправді праві. DbContext
є реалізацією схеми одиниці роботи і IDbSet
є реалізацією шаблону сховища.
Зараз сховища дуже популярні та використовуються. Усі користуються ними лише тому, що є десятки статей про створення репозиторію для сутності, але насправді ніхто не описує труднощів, пов'язаних з цим рішенням.
Основні причини використання сховища зазвичай:
- Сховати EF від верхнього шару
- Зробіть код краще перевіреним
Перша причина - це якась архітектонічна чистота та чудова ідея, що якщо ви зробите свої верхні шари незалежними від EF, ви зможете пізніше перейти на іншу стійкість. Скільки разів ви бачили таке в реальному світі? Ця причина робить роботу з EF набагато складнішою, оскільки ваш сховище повинне відкрити безліч додаткових функцій, які надають змогу використовувати те, що дозволяє EF за замовчуванням.
У той самий час обшивка коду EF може підтримувати ваш код краще організованим та слідуючи правилу розділення проблем. Для мене це може бути єдиною реальною перевагою сховища та одиниці роботи, але ви повинні розуміти, що дотримання цього правила з EF, можливо, зробить ваш код краще рентабельним і легше читабельним, але в початкових зусиллях по створенню вашої програми буде набагато вище і для менших застосувань це може бути зайвою складністю.
Друга причина частково правильна. Великим недоліком EF є жорстка архітектура, над якою важко знущатися, тому якщо ви хочете встановити верхній шар тесту, ви повинні якось обернути EF, щоб дозволити знущатися над його реалізацією. Але це має багато інших наслідків, які я тут описав .
Я слідкую за блогом Айенде . Якщо ви коли-небудь використовували NHibernate, ви, напевно, знаєте його статті. Нещодавно цей хлопець написав декілька статей проти використання сховища з NHibernate, але NHibernate набагато краще піддається макетуванню.