Не использовать другой/Repository уровня абстракции UOW
Как OP правильно указал, Entity Framework (аналогично, например, NHibernate и другие ORMs) уже обеспечивает абстракцию базы данных для вас как с транзакционным «единица работы» и «репозитории», которые доступны вам.
Дополнительный уровень абстракции UoW/репозитория - это anti-pattern, которого следует избегать любой ценой. Есть многочисленные проблемы, связанные с этим, наиболее важными из них являются:
- они мешают вам использовать всю мощь базового ОРМА (ленивые нагрузки, нетерпеливые нагрузки, сложные запросы, ....)
- если они хотят предоставить какие-либо дополнительные преимущества, помимо простого CRUD, они будут протекающими (то есть отражают возможности, имеющиеся в лежащей в основе ORM).
Но, но, но ...
Мне нужно, чтобы иметь возможность модульного тестирования, насмехаясь над моим репозиториев
Нет, вы не знаете. Просто используйте базу данных с контентом, определенным для вашего теста. Используйте базу данных в памяти (например, SQLite, Effort, ...), если вы хотите, чтобы это было быстрее.
EF не обеспечивает бизнес-логику, которая не выражается в отношениях данных ... Для того, чтобы обеспечить соблюдение этого типа логики, вы должны построить OUW/Repository/и какой-то вокруг контекста EF.
Нет, не надо. Для реализации вашей бизнес-логики в инфраструктуре уровень абстракции, такой как единица работы или репозиторий, просто неверен.
- Ценный бизнес-логика принадлежит субъектов домена, доменных служб, команд домена или для длительных бизнес-процессов, запущенных, саг.
- Простые проверки (т. Е. Не
null
, значение между x
и y
): это не должно решаться на границах вашего системного интерфейса.
отметить также, что простые CRUD действия типа без каких-либо ценных бизнес-логики не нужно пройти через все «слой обручами», то есть избежать такой схеме:
- базы данных → Entity без поведения → DTO → View Model → Просмотр
- Редактировать поля
- Посмотреть → вид Модель → DTO → Entity без поведения → базы данных
Просто загрузите его прямо с вашего ОРМ в контроллере в виде «View Model», необходимого для зрения, и сохраните его прямо из контроллера.
На абстракциях
Ненужные абстракции и слой обручи, таких как они являются злым.Они запутывают ваш код, связывают руки, просачиваются, увеличивают размер вашего кода и, следовательно, количество ошибок в вашем коде, не добавляя добавленной стоимости.
Используйте абстракции, когда они предлагают вам дополнительную ценность, например. когда вам необходимо их в решении сквозных проблем, захват/управление повторяющимися узорами в вашей архитектуре, ...
Создание абстракций для абстрагирования - пустая трата времени.
Интересно то же самое каждый раз, когда я вижу вопросы с терминами «единица работы» или «репозиторий» в сочетании с тегом «entity-framework». Я буду смотреть это ... +1 – spender
@spender yup Забавно, сколько людей пытается добавить еще один слой абстракции над тем, что уже абстрагирует базу данных для них. Я не считаю, что OP в этом вопросе (http://stackoverflow.com/questions/29857589/working-with-entity-and-repository) оценил мой [ответ] (http://stackoverflow.com/a/ 29857710/2573395) много. Я также буду следить за этим вопросом с интересом. – Alex
Возможный дубликат http://stackoverflow.com/q/14110890/1515209 – qujck