В настоящее время я нахожусь в процессе разработки / реализации шаблона репозитория в приложении .NET.После многих дней исследований я чувствую, что подхожу ближе, но на самом деле существует так много идей и мнений, что я надеялся узнать мнение некоторых людей о конструктивных соображениях, которые у них могли возникнуть, если вы уже внедрили один из них.Итак ...
Итак, основная проблема дизайна, с которой я сталкиваюсь, это ... Общие против определенных репозиториев?Об этом много всего, и я много думал об этом, и все еще не определился.Я буду реализовывать интерфейс IRepository и базовый класс Repository.Затем принимается решение: оставить реализацию репозитория таким образом или сделать класс Repository абстрактным классом и расширить его с помощью определенных репозиториев так:
public Repository<T> Repository : IRepository<T>
instantiated as: Repository<Customer> CustomerRepository = new Repository<Customer>
или
public CustomerRepository CustomerRepository : Repository<T>, ICustomerRepository
instantiated as: CustomerRepository CustomerRepository = new CustomerRepository()
Изначально ябыл определенно для конкретной реализации.Количество повторного использования кода и уменьшенное количество интерфейсов и классов с общим репозиторием - большой плюс, но я считаю, что контракт, который он определяет, просто слишком широк.Разрешение запрашивать у уровня доступа к данным практически любым способом внешних объектов может привести ко всем видам проблем с производительностью и оптимизацией (как может администратор БД узнать, какие запросы выполняются на БД, не прочесывая весь код ... возможно, вверхна уровне пользовательского интерфейса !!!).Это привело меня к конкретным репозиториям, которые могут наследоваться от абстрактного BaseRepository, чтобы воспользоваться преимуществами повторного использования кода, в то же время определяя узкий контракт, такой как методы, такие как GetCustomerByName ().
Я думаю, что это хорошее решение, но в окончательном проекте, который я получил, также используется общий шаблон репозитория вместе с шаблоном спецификации.Это мне очень нравится, так как позволяет инкапсулировать запросы на сущности в классы.Очень элегантный, обеспечивающий управление запросами, а не бесплатную продажу!Хотя пара предостережений ...
1) Ограничивает ли использование спецификаций свободу перехода к другому источнику данных?Шаблон спецификации довольно легко использовать в репозитории, если источник данных поддерживает LINQ.Таким образом, наш метод хранилища будет выглядеть примерно так:
IEnumerable<T> Query(ISpecification<T> specification);
Но что если мы захотим создать хранилище с использованием более старого поставщика ADO.Net 2.0.Не нужно ли теперь каким-либо образом преобразовывать запросы в SQL-запрос в хранилище ???Или же всю таблицу клиентов нужно будет прочитать в память, поэтому каждый отдельный клиент должен быть проверен, прежде чем совпадения могут быть возвращены в совокупность.Это будет проблемой для нас ... У нас есть клиент, использующий базу данных MySQL, которая поддерживает .NET 4.0, но также и другой клиент с устаревшей базой данных DB2, у которого есть только поставщик .NET 2.0.
2) икак в случаях, когда задачи CRUD для каждого объекта могут быть нестандартными.то есть.Может быть, клиент не может быть удален ... Может быть, создание какой-то другой сущности не соответствует обычному шаблону создания других сущностей?Как это можно сделать с помощью общего хранилища.Мне действительно нравится модернизированный дизайн универсального репозитория с шаблоном спецификации, но я вернусь к конкретным репозиториям, если это не будет поддерживаться.Извините, что это было так долго ... но было бы здорово услышать идеи людей по этому поводу?
Я также хотел бы реализовать Unit Of Work и DI, но я хочу завершить дизайн своего хранилища, прежде чем двигаться дальше.