Чи потрібні сховища більше в ASP.net 5 та EF7?


9

Я опублікував питання на github команді EF. Я отримав відповідь про те, що було б краще задати це питання тут, щоб я скопіював і вставив його сюди, як ми як посилання, щоб інші могли побачити кілька відповідей на GitHub.

Питання: Я робив деякі дослідження, і хтось зазначив, що рядок 24 класу DBContext визначає

DbContext - це комбінація шаблонів одиниці роботи та сховища.

Чи означає це, що нам більше не потрібно абстрагувати EF до сховища, а потім використовувати та інтерфейс для введення його в контролери?

Оригінальна публікація в Github: https://github.com/aspnet/EntityFramework/isissue/4899

Причиною цього я є те, що я, схоже, потрапляю в місце, де я додаю в методику сховища, як GetById, GetByName, GetWithIncludesABC, GetWithIncludes123, тощо.


1
Що ви думаєте про відповідь, яку дав ревінець? Мені здається цілком розумним.
Роберт Харві

@RobertHarvey Так, це була хороша відповідь, але я хочу побачити, як люди ставляться до цієї теми, перш ніж приймати рішення про сховище чи ні
Loren.Dorez

див. також lostechies.com/jimmybogard/2009/09/11/wither-the-repository, де Богард сперечається аналогічно.
mcknz

Я вважаю, чому EF (та інші ORM) не є сховищами .
Ерік Кінг

У сховищі не було б такого методу, як GetWithIncludesABC. Шаблон сховища - це в основному абстракція таблиці бази даних як колекції. Зазвичай є можливість запиту колекції (наприклад, LINQ), і сховище перетворює запит у SQL. Те, про що ви говорите, більше схоже на шлюз даних.
Містер Кохез

Відповіді:


12

Якщо ви додаєте такі способи до сховища, як

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

Тоді вам краще перейти на службовий шар і дозволити службовому шару безпосередньо використовувати EF. EF вже має функціонал, подібний до вищевказаних методів, який ви просто нескінченно копіюєте.

Службовий шар розкриває методи бізнес-домену та використовує CRUD для їх реалізації. Наприклад, у вас може бути метод, який називається TransferMoney(A, B), де A і B перевіряють акаунти. Це дозволяє розмовляти мовою домену вашого бізнесу, тоді як службовий шар обробляє CRUD для вас.

Єдиною переконливою причиною, з якої я можу подумати, де ви можете мати окремий шар репозиторію, є те, що ви можете знущатися над цим шаром сховища або замінювати інше джерело даних для цілей тестування.


Однак ви можете знущатися над dbset ... msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx
S1r-Lanzelot

4

Роберт Харві у відповідь сказав:

Єдиною переконливою причиною, з якої я можу подумати, де ви можете мати окремий шар репозиторію, є те, що ви можете знущатися над цим шаром сховища або замінювати інше джерело даних для цілей тестування.

Саме тому шаблон репозиторію залишається актуальним. Я також не погоджуюся з твердженням команд Entity Framework, що вони реалізують шаблон репозиторію. Entity Framework все ще дуже прив’язаний до бази даних. Вся мета шаблону репозиторію полягає в тому, щоб відокремити та абстрагувати точний механізм збереження, який використовується у вашій програмі, так що нічого із впровадження доступу до даних не протікає поза шаром сховища.

Якщо ви використовуєте API запитів EF за межами "сховища", наприклад, у службовому об'єкті якогось типу, я б сказав, що ви порушуєте шаблон.

Тепер, якщо це не катастрофічна проблема для бази даних, як функціональність, просочитися до іншого коду, і ви можете гарантувати, що вам не потрібно буде переносити деякі ваші операції CRUD у веб-службу в майбутньому, то використання EF безпосередньо було б ДОБРЕ.

В основному, Entity Framework займає місце об'єкта шлюзу в шаблоні репозиторію. Я не розглядаю це як власне сховище.


Чим репозиторій відрізняється від аспекту рівня обслуговування? з того, що я можу знайти, якщо я повертаю IQueryable, то я, по суті, репозиторій, якщо я повертаю IEnumerable, то я використовую сервісний рівень. Це правильно? Чи схожі шаблони шару обслуговування та сховища?
Лорен.Дорез

@ Loren.Dorez: У службовому шарі є методи, що стосуються бізнес-домену, як-от TransferFunds()і BuildWidget(). Репозиторій просто містить методи CRUD.
Роберт Харві

Отже, і рівень обслуговування, і сховище безпосередньо отримували б доступ до DBContext тоді? Отже, ви б помістили CRUD в Repo і Get Metod та інші методи у службовому шарі? Я правильно це розумію?
Лорен.Дорез

Службовий шар може отримати доступ до сховища, якщо у вас є, замість EF безпосередньо.
Роберт Харві

@RobertHarvey Чи можете ви показати мені приклад, використовуючи Get Methds вище? Як зараз я трохи розгублено вибачте.
Лорен.Дорез

1

Сховища схожі не потрібні - Microsoft у своїх прикладних додатках мікросервісів не використовує їх:

https://github.com/Microsoft/BikeSharing360_BackendServices

Зразок програми BikeSharing був показаний на Connect (); подія (я думаю, вона може бути використана як шаблон для проектів API):

https://blogs.msdn.microsoft.com/visualstudio/2016/12/14/connectdemos-2016-bikesharing360-on-github/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.