2015-04-30 3 views
4

Это примерно некоторая путаница у меня есть о некоторых рамочном сущность материала я нашел здесь: https://www.asp.net/UOW и Repository Узор в EF5

На этой странице объясняется, как обернуть DbContext используя хранилище, и завернуть хранилище с помощью блока аа работы класса: http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

Однако на этой странице говорится, что DbContext уже сочетание как шаблон UOW и хранилище шаблона: https://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.103).aspx

Итак, если проблема, решаемая этими шаблонами, уже решена с помощью dbcontext, зачем повторно использовать эти шаблоны с EF5?

Кроме того, в учебнике класс UnitOfWork не показывает какой-либо выгоды, которую должен дать UOW. например, в нем говорится: «Таким образом, когда часть работы будет завершена, вы можете вызвать метод SaveChanges на этом экземпляре контекста и быть уверенным, что все связанные изменения будут скоординированы».

, но все это, кажется, делает это оболочка dbcontext без всякой причины. Я думаю, что чего-то не хватает. Я не вижу никакой координации в этой реализации ... И как делать «откат», если что-то пойдет не так?

+0

Интересно то же самое каждый раз, когда я вижу вопросы с терминами «единица работы» или «репозиторий» в сочетании с тегом «entity-framework». Я буду смотреть это ... +1 – spender

+0

@spender yup Забавно, сколько людей пытается добавить еще один слой абстракции над тем, что уже абстрагирует базу данных для них. Я не считаю, что OP в этом вопросе (http://stackoverflow.com/questions/29857589/working-with-entity-and-repository) оценил мой [ответ] (http://stackoverflow.com/a/ 29857710/2573395) много. Я также буду следить за этим вопросом с интересом. – Alex

+1

Возможный дубликат http://stackoverflow.com/q/14110890/1515209 – qujck

ответ

0

Вещь в EF заключается в отсутствии бизнес-логики в функциях OUW или репозитория, которые она предоставляет. Если вы вызываете SaveChanges, он с радостью сохранит все изменения. Тем не менее, существует требование, что при добавлении, скажем, виджета, необходимо добавить Frobber для виджета, вам не повезло (если только не существует зависимости FK). Для любой части бизнес-логики, которая не выражается в отношениях данных, EF из коробки не обеспечивает ее соблюдение.

Чтобы обеспечить соблюдение этого типа логики, вам необходимо создать OUW/Repository (оба) в контексте EF. Это единственная причина, по которой вы это сделаете, насколько мне известно.

2

Я уже много писал об этом here, но я подведу итог в вашу пользу. Да, Entity Framework уже реализует шаблоны UoW (DbContext) и репозитория (DbSet). Нет никакой пользы в повторной реализации их еще раз. На самом деле, есть большой ущерб, так как он значительно увеличивает затраты на обслуживание вашего проекта.

Почему Microsoft включила это во вступительные руководства? Честно говоря, я не уверен, но это была ошибка, которая преследовала множество новых разработчиков MVC, включая меня, когда я только начинал.

В какой-то абстракции есть преимущество, так что ваш проект не зависит от какого-либо конкретного способа получения данных. Однако эта абстракция должна возвращать конкретные данные, необходимые вашим действиям, не более, не менее. Из-за отсутствия лучшего слова я называю это «услугой», хотя Microsoft применила к этому слову совершенно другое значение через SOA. Просто, это похоже на то, что вы просто создаете API для своего приложения, как если бы вы создавали веб-API, только полностью основанный на коде (не требующий реального HTTP-соединения). Затем он переходит в ваш слой DAL (библиотека классов или аналогичный), который может ссылаться на ваш проект.

3

Не использовать другой/Repository уровня абстракции UOW

Как OP правильно указал, Entity Framework (аналогично, например, NHibernate и другие ORMs) уже обеспечивает абстракцию базы данных для вас как с транзакционным «единица работы» и «репозитории», которые доступны вам.

Дополнительный уровень абстракции UoW/репозитория - это anti-pattern, которого следует избегать любой ценой. Есть многочисленные проблемы, связанные с этим, наиболее важными из них являются:

  • они мешают вам использовать всю мощь базового ОРМА (ленивые нагрузки, нетерпеливые нагрузки, сложные запросы, ....)
  • если они хотят предоставить какие-либо дополнительные преимущества, помимо простого CRUD, они будут протекающими (то есть отражают возможности, имеющиеся в лежащей в основе ORM).

Но, но, но ...

Мне нужно, чтобы иметь возможность модульного тестирования, насмехаясь над моим репозиториев

Нет, вы не знаете. Просто используйте базу данных с контентом, определенным для вашего теста. Используйте базу данных в памяти (например, SQLite, Effort, ...), если вы хотите, чтобы это было быстрее.

EF не обеспечивает бизнес-логику, которая не выражается в отношениях данных ... Для того, чтобы обеспечить соблюдение этого типа логики, вы должны построить OUW/Repository/и какой-то вокруг контекста EF.

Нет, не надо. Для реализации вашей бизнес-логики в инфраструктуре уровень абстракции, такой как единица работы или репозиторий, просто неверен.

  • Ценный бизнес-логика принадлежит субъектов домена, доменных служб, команд домена или для длительных бизнес-процессов, запущенных, саг.
  • Простые проверки (т. Е. Не null, значение между x и y): это не должно решаться на границах вашего системного интерфейса.

отметить также, что простые CRUD действия типа без каких-либо ценных бизнес-логики не нужно пройти через все «слой обручами», то есть избежать такой схеме:

  1. базы данных → Entity без поведения → DTO → View Model → Просмотр
  2. Редактировать поля
  3. Посмотреть → вид Модель → DTO → Entity без поведения → базы данных

Просто загрузите его прямо с вашего ОРМ в контроллере в виде «View Model», необходимого для зрения, и сохраните его прямо из контроллера.

На абстракциях

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

Используйте абстракции, когда они предлагают вам дополнительную ценность, например. когда вам необходимо их в решении сквозных проблем, захват/управление повторяющимися узорами в вашей архитектуре, ...

Создание абстракций для абстрагирования - пустая трата времени.

-2

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

Смежные вопросы