1) Що робити, якщо ви хочете вимкнути ORM, у вашій програмі буде вказаний специфічний код ORM, якщо ви не будете містити його у сховищі.
Я ще не в змозі, коли компанія раптом вирішила переключити технологію доступу до даних. Якщо це все-таки відбудеться, знадобиться деяка робота. Я схильний до абстрактних операцій доступу до даних через інтерфейси. Сховище - один із способів вирішити це.
Тоді я мав би іншу збірку для конкретної реалізації свого рівня доступу до даних. Наприклад, у мене можуть бути:
Company.Product.Data
і Company.Product.Data.EntityFramework
збірок. Перша збірка буде використовуватися виключно для інтерфейсів, коли інша буде конкретною реалізацією логіки доступу до даних Entity Framework.
2) Чи все ще діє схема репозиторію, коли ви не використовуєте ORM, і ви використовуєте ADO.net для доступу до даних та заповнення даних об'єкта самостійно?
Я думаю, що вам вирішувати, яка модель справедлива чи ні. Я використовував шаблон репозиторію в шарі презентації. Слід пам’ятати, що люди люблять кидати відповідальність у сховища. Перш ніж ви це дізнаєтесь, ваш клас сховища буде танцювати, співати та робити всілякі речі. Ви хочете цього уникнути.
Я бачив клас сховища, який розпочався завдяки обов'язкам GetAll, GetById, Update та Delete, що добре. На той момент, коли проект був завершений, той самий клас мав десятки методів (обов'язків), яких ніколи не було. Наприклад, GetByForename, GetBySurname, UpdateWithExcluds та всілякі шалені речі.
Тут грають запити та команди.
3) Якщо ви використовуєте ORM, але не шаблон сховища, де ви зберігаєте загальновживані запити. Чи було б розумно представляти кожен запит класом і мати якусь фабрику запитів для створення екземплярів?
Я думаю, що це дуже гарна ідея використовувати запити та команди замість сховищ. Я роблю наступне:
Визначте інтерфейс для запиту. У цьому вам допоможе одиничне тестування. Напрpublic interface IGetProductsByCategoryQuery { ... }
Визначте конкретну реалізацію для запиту. Ви зможете вводити їх через IoC-рамку на ваш вибір. Напрpublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
Тепер замість забруднення сховища з десятками обов'язків я просто групую свої запити в простори імен. Наприклад, інтерфейс для вищезазначеного запиту може містити: Company.SolutionName.Products.Queries
а реалізація може житиCompany.SolutionName.Products.Queries.Implementation
Що стосується оновлення чи видалення даних, я використовую командний зразок таким же чином.
Деякі можуть погодитись і сказати, що до завершення проекту у вас буде десятки класів та просторів імен. Так, ти будеш. На мій погляд, це гарна річ, оскільки ви можете переглядати рішення в IDE на ваш вибір і миттєво бачити, які обов'язки є певним компонентом. Якщо ви вирішили скористатися шаблоном сховища, вам доведеться заглянути все до класу сховищ, намагаючись розробити його обов'язки.