Вопрос о репозитории - PullRequest
       16

Вопрос о репозитории

0 голосов
/ 06 апреля 2011

Сначала я создал новый интерфейс репозитория для каждой из моих сущностей, например, IClientRepository.Затем я создал класс для каждой сущности, например, SqlClientRepository.Я сделал это для многих моих сущностей, а затем понял, что у них всех одинаковые методы: Add, Update, Delete, GetAll.

Итак, я понял, что, вероятно, мне следует просто создать один интерфейс, а не создавать отдельный для каждого.

Проблема в том, что теперь мое внедрение зависимостей не будет работать, поскольку я могу сопоставить интерфейс только одному репозиторию:

Bind<IClientRepository>().To<SqlClientsRepository>().WithConstructorArgument("connectionString", WebConfigurationManager.ConnectionStrings["MyDb"].ConnectionString);

Единственный обходной путь, который я вижу, - это объединить всеиз репозиториев или вернитесь к моей первой попытке.Использование первой попытки также позволило бы мне изменить типы возвращаемых данных для некоторых объектов, например, IClientRepository.Add () может вернуть идентификатор нового клиента, а некоторым другим объектам это может не понадобиться.

Оцените любые мысли.

Ответы [ 4 ]

2 голосов
/ 06 апреля 2011

Вы можете сделать так, чтобы ваш ClientRepository реализовывал как ваш BaseRepository , так и определенный IClientRepository. Таким образом, ваша база может иметь обычные Add / Remove и т. Д., А ваш IClientRepository может иметь специализированные методы (или, в некоторых случаях, быть пустым) Ваш IoC может разрешиться с помощью IClientRepository.

Вот как я это делаю:

public class CustomerRepository : BaseRepository<Customer>, ICustomerRepository {...}
and
unityContainer.RegisterType<ICustomerRepository, CustomerRepository>();

Удачи:)

0 голосов
/ 06 апреля 2011

Одно из решений - сделать интерфейс универсальным .таким образом, он достаточно общий, но при этом остается гибким.

0 голосов
/ 06 апреля 2011

Трудно сказать наверняка, не зная, чего вы пытаетесь достичь.В моем последнем проекте есть один репозиторий на класс, IRepository<T>.Это может избавить вас от проблемы связывания IoC.

0 голосов
/ 06 апреля 2011

Общий подход к репозиториям - создать базовый интерфейс, такой как «IRepository», с общими методами CRUD или методами, которые могут использовать все репозитории. Затем для каждого конкретного репозитория создайте новый интерфейс, производный от базового интерфейса, но включающий в себя доменные методы для этого репо. То же самое можно сделать для базовой реализации репозитория и более специфических классов реализации. Таким образом, у вас есть общее место для общей функциональности, но у вас все еще есть определенные интерфейсы для каждой конкретной реализации репозитория для конкретного домена.

...