Ответ 1
Первый аргумент состоит в том, что EF не работает с интерфейсами. DbSet
должен быть определен с реализацией реального объекта.
Второй аргумент состоит в том, что ваши объекты не должны содержать DbSet
- это связанный с контекстом класс, и ваши сущности должны быть чистыми от такой зависимости, если вы не собираетесь внедрять шаблон Active record. Даже в таком случае у вас определенно не будет доступа к DbSet
другого объекта в другом объекте. Даже если вы обертываете набор, вы все еще слишком близки к EF, и сущность никогда не имеет свойства, обращающегося ко всем сущностям другого типа сущности (а не только к текущему экземпляру).
Просто, чтобы было ясно, что DbSet
в EF имеет особое значение - это не коллекция. Это точка входа в базу данных (например, каждый запрос LINQ в базе данных "t20 > hits" ), и она находится в обычных сценариях, которые не отображаются на объектах.
Третий аргумент состоит в том, что вы используете один контекст для каждого приложения - у вас есть отдельный частный экземпляр для одного элемента factory. Если вы не выполняете какое-то одноразовое пакетное приложение это определенно неправильно.
Последний аргумент просто практичен. Вам платят за предоставление функций, а не за трату времени на абстракцию, которая не дает вам (и вашему клиенту) никакой коммерческой ценности. Дело не в том, чтобы доказать, почему вы не должны создавать эту абстракцию. Это доказывает, почему вы должны это делать. Какую ценность вы получите от его использования? Если ваши коллеги не могут прийти с аргументами, которые имеют деловую ценность, вы можете просто пойти к менеджеру вашего продукта и позволить ему использовать свою власть - он держит бюджет.
В целом абстракция является частью хорошо спроектированного объектно-ориентированного приложения - это правильно. НО:
- Каждая абстракция сделает ваше приложение как-то более сложным и увеличит стоимость и время разработки.
- Не каждая абстракция сделает ваше приложение лучше или удобнее обслуживать - слишком большая абстракция имеет обратный эффект.
- Тестирование EF затруднено. Говорить, что вы будете абстрагировать доступ к данным таким образом, что вы можете заменить его другой реализацией, является задачей для гуру доступа к данным. Прежде всего, вы должны иметь очень хороший опыт работы со многими технологиями доступа к данным, чтобы иметь возможность определять такую абстракцию, которая будет работать со всеми из них (и в конце вы можете только сказать, что ваша абстракция работает с технологиями, о которых вы думали при разработке этого). Ваша абстракция будет работать только с API EF DbContext и ничем иным, потому что это не абстракция. Если вы хотите создать универсальную абстракцию, вы должны начать изучать шаблон репозитория, шаблон работы и шаблон спецификации, но это большая работа, чтобы сделать их и реализовать их универсальными. Первым шагом является скрытие всего, что связано с доступом к данным за этой абстракцией - включая LINQ!
- Абстрагирование доступа к данным для поддержки нескольких API-интерфейсов имеет смысл только в том случае, если вам это нужно сейчас. Если вы только думаете, что это может быть полезно в будущем, чем в бизнес-проектах, совершенно неправильное решение, а разработчик, который пришел с этой идеей, не компетентен принимать решения о таргетинге на бизнес.
Когда имеет смысл делать "много" абстракции?
- У вас есть такое требование сейчас - это переносит бремя такого решения на лицо, ответственное за бюджет/объем проекта/требования и т.д.
- Теперь вам нужна абстракция, чтобы упростить дизайн или решить какую-либо проблему.
- Вы делаете проект с открытым исходным кодом или хобби, и вы не руководствуетесь потребностями бизнеса, а чистотой и качеством вашего проекта.
- Вы работаете на платформе (длинный живой розничный продукт, который будет жить в течение длительного времени) или в общедоступной структуре - это обычно возвращается к первому пункту, потому что этот тип продуктов обычно имеет такую абстракцию, как требование
Если вы работаете только с целевым приложением (в основном одноцелевые приложения по требованию или сторонние решения), абстракция должна использоваться только при необходимости. Эти приложения обусловлены затратами - целью является предоставление рабочего решения для минимальных затрат и в кратчайшие сроки. Эта цель должна быть достигнута, даже если результирующее приложение не будет очень хорошим внутри - единственное, что имеет значение, - это соответствие приложения требованиям. Любая абстракция, основанная на "что, если... произойдет" или "возможно, нам понадобится...", увеличивает расходы по виртуальным (не существующим) требованиям, которые в 99% никогда не произойдут, и в большинстве случаев первоначальный контракт с клиентом не учитывается которые такие дополнительные расходы.
Btw. этот тип приложений ориентирован на MS API и дизайнерскую стратегию - MS создаст множество дизайнеров и генераторов кода, которые создадут не оптимальные, но дешевые и быстрые решения, которые могут быть созданы людьми с меньшим набором навыков и очень дешевы. Последний пример - LightSwitch.