AutoFac IoC, DDD и зависимости между репозиториями

У меня есть два типа POCO, A и B. У меня есть репозиторий для каждого, Rep > и Rep >, оба из которых реализуют IRep > и IRep > обслуживаются контейнером IoC (в данном случае AutoFac).

Существует несколько типов репозиториев - загрузка по запросу из БД (или что-то еще), коллекции с отложенной загрузкой в ​​памяти, кешированные результаты веб-сервисов и т. д. Вызывающие абоненты не видят разницы. И Rep >, и Rep > оказываются коллекциями в памяти, поскольку A и B не сильно меняются и живут долго.

Один из них. свойство B - это A. Теперь я делаю следующее: когда B запрашивают его A, B получает IRep >, чтобы найти его A, и возвращает его. Он делает это каждый раз - каждый запрос B для A включает IRep >. Find (). Плюс в том, что B никогда не держится за A, и каждый запрос принимает во внимание, каким бы ни было состояние Rep. Обратной стороной является большое количество оттока IoC / IRep >.

Я подумываю использовать здесь шаблон Lazy >, чтобы объект B запрашивал IRep > один раз и держится за то, что получил. Но что произойдет, если A будет удален из своего репозитория?

Я ищу чистый способ для Rep > уведомить всех, кого это интересует, об изменении. В моем примере может быть удален определенный элемент B из A, поэтому я хотел бы, чтобы Rep > вызывал событие, когда что-то удаляется или добавляется и т. Д. Rep > может подписаться на это событие, чтобы очистить любые B, которые относятся к A, которые теперь исчезли, и т.д. Как его подключить?

В идеале ничего не меняется при создании экземпляра Rep >. Он не должен иметь представления о том, кто слушает, и А можно было бы манипулировать в течение всего дня, даже не запуская представителя

. Но когда появится Rep >, ему понадобится способ подписаться на Rep ] > событие. Возможно, представителя > еще нет в живых, но наверняка он появится, когда у B спросят его A, так что, похоже, можно запустить Rep > .

По сути, когда создается экземпляр Rep >, он хочет, чтобы он зарегистрировался в Rep > для уведомления о событии. Я не хочу загрязнять IRep < T >, потому что это не имеет значения для кого-либо за пределами уровня репозитория. И другие типы репозиториев могут не беспокоиться об этом вообще.

Есть ли в этом смысл?

5
задан n8wrl 27 April 2011 в 19:15
поделиться