1) Что вы делаете, если вы хотите отключить ORM, у вас будет конкретный код ORM в вашем приложении, если вы не будете содержать его в репозитории.
Я еще не был в положении, когда компания вдруг решила переключить технологию доступа к данным. Если это произойдет, потребуется некоторая работа. Я склонен абстрагировать операции доступа к данным через интерфейсы. Репозиторий является одним из способов решения этой проблемы.
Тогда у меня была бы другая сборка для конкретной реализации моего уровня доступа к данным. Например, я мог бы иметь:
Company.Product.Data
и Company.Product.Data.EntityFramework
сборки. Первая сборка будет использоваться исключительно для интерфейсов, тогда как другая будет конкретной реализацией логики доступа к данным Entity Framework.
2) Является ли шаблон хранилища действительным, если не используется ORM, и вы используете ADO.net для доступа к данным и заполнения данных объекта самостоятельно?
Я думаю, что вам решать, какой шаблон действителен или нет. Я использовал шаблон репозитория на уровне представления. Нужно иметь в виду, что людям нравится бросать обязанности в репозитории. Прежде чем вы это узнаете, ваш репозиторий будет танцевать, петь и делать разные вещи. Вы хотите избежать этого.
Я видел класс репозитория, который начинался с обязанностей GetAll, GetById, Update и Delete, что хорошо. К тому времени, когда проект был завершен, у того же класса были десятки методов (обязанностей), которых никогда не должно было быть. Например, GetByForename, GetBySurname, UpdateWithExclusion и всякие сумасшедшие вещи.
Это где запросы и команды вступают в игру.
3) Если вы используете ORM, но не шаблон репозитория, где вы храните часто используемые запросы. Было бы разумно представлять каждый запрос как класс и иметь какую-то фабрику запросов для создания экземпляров?
Я думаю, что это хорошая идея - использовать запросы и команды вместо репозиториев. Я делаю следующее:
Определить интерфейс для запроса. В этом вам поможет юнит тест. Напримерpublic interface IGetProductsByCategoryQuery { ... }
Определите конкретную реализацию для запроса. Вы сможете внедрить их через IoC-фреймворк по вашему выбору. Напримерpublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
Теперь вместо того, чтобы загрязнять хранилище десятками обязанностей, я просто группирую свои запросы в пространства имен. Например, интерфейс для вышеупомянутого запроса может жить в: Company.SolutionName.Products.Queries
и реализация может жить вCompany.SolutionName.Products.Queries.Implementation
Когда дело доходит до обновления или удаления данных, я использую шаблон команд таким же образом.
Некоторые могут не согласиться и сказать, что до завершения проекта у вас будут десятки классов и пространств имен. Да, вы будете. На мой взгляд, это хорошая вещь, так как вы можете просмотреть решение в IDE по вашему выбору и сразу увидеть, какие обязанности выполняет определенный компонент. Если вы решили вместо этого использовать шаблон репозитория, вам придется заглянуть внутрь каждого класса репозитория, пытаясь выяснить его обязанности.