Запах кода в том, что в хранилище есть события изменения? - PullRequest
5 голосов
/ 26 сентября 2011

Я не видел событий изменений, используемых в реализациях шаблонов репозитория, но я бы хотел, чтобы мой репозиторий был таким:

interface IEntityRepository
{
    event EventHandler<EntityChangedEventArgs> EntityAdded;
    event EventHandler<EntityChangedEventArgs> EntityRemoved;

    IEnumerable<Entity> GetAll();
    Entity GetById(int id);
}

Это в основном потому, что мои сущности можно добавлять и удалять изтолько извне, а не клиентом IEntityRepository.

Неужели я так ошибочно отношусь к шаблону репозитория, поступая таким образом, или у меня есть действительный случай?

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

Я бы сказал, да, если вы собираетесь использовать фактический шаблон репозитория Фаулера.Этот шаблон призван стать посредником между бизнес-уровнями и уровнями данных, предоставляя интерфейс , подобный .Он не был предназначен для хранения данных.Тем не менее, если вы просто хотите создать коллекцию, которая оборачивает API и предоставляет события, когда все меняется, делайте это во что бы то ни стало.Иногда вам не нужно следовать предопределенному шаблону.

Если вы хотите, чтобы это был шаблон, я бы сказал, что он больше похож на шаблон Object Pool или Observer.Рассмотрим случай IObservable с использованием Reactive Extensions (Rx) .Это позволит вам реагировать на уровень PInvoke и выполнять свои обязанности в будущем.Код на самом деле оказывается более эффективным, чем события.Используя события, вы должны поддерживать этот репозиторий, отслеживать время жизни объекта, возможно, сделать этот репозиторий одиночным и предоставить ему некоторое управление потоками.С Rx вы просто помещаете действие в очередь наблюдателя.

Но, в конце концов, используйте то, что кажется вам наиболее естественным.Шаблоны - это просто предложения, и они не всегда существуют для каждого потенциального варианта использования.Это один из таких случаев.

0 голосов
/ 15 июня 2017

У меня похожая проблема, когда мне нужно публиковать события в хранилище событий для операций CUD с базой данных (не касается операций чтения). Вместо того, чтобы изменять мой репозиторий, я создал декоратор и внедрил его (используя SimpleInjector ). Это удовлетворяет принципу Открыто / Закрыто и Единой Ответственности, и на самом деле это обеспечивает более чистый способ удовлетворить это требование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...