【发布时间】:2011-04-27 19:15:50
【问题描述】:
我有两种 POCO 类型,A 和 B。我有一个存储库,分别是 Rep<A> 和 Rep<B>,它们都实现了 IRep<A> 和 IRep<B> 服务于一个 IoC 容器(在本例中为 AutoFac)。
有几种存储库 - 从数据库(或其他)按需加载、内存中延迟加载的集合、缓存的 Web 服务结果等。调用者无法区分。 Rep<A> 和 Rep<B> 都恰好是内存中的集合,因为 A 和 B 的变化不大并且寿命很长。
B 的属性之一是 A。我现在所做的是,当 B 被要求提供其 A 时,B 获取 IRep<A> 以找到其 A 并返回它。它每次都这样做——对 B 的 A 的每个请求都涉及 IRep<A>.Find()。好处是 B 永远不会保留 A 并且每个请求都会考虑 Rep 的状态。缺点是大量的 IoC/IRep<A> 流失。
我正在考虑在这里使用 Lazy<T> 模式,以便 B 询问 IRep<A> 一次并保留它得到的信息。但是,如果从其存储库中删除 A 会发生什么?
我正在为 Rep<A> 寻找一种简洁的方式,以便在它发生变化时通知任何感兴趣的人。在我的示例中,某个 B 的 A 可能会被删除,因此我希望 Rep<A> 在删除或添加某些内容等时引发事件。Rep<B> 可能会订阅此事件以清理任何 B指的是现在已经消失的 A 等等。如何连接它?
理想情况下,实例化 Rep<A> 时不会发生任何变化。它应该不知道谁在听,而且 A 可能会整天被操纵而不会触发 Rep。
但是当 Rep<B> 诞生时,它需要一种订阅 Rep<A> 事件的方法。可能还没有一个 Rep<A> 活着,但肯定会有一个 B 被要求提供它的 A,所以启动一个 Rep<A> 似乎是可以的。
本质上,当 Rep<B> 被实例化时,它希望它向 Rep<A> 注册自己以获取事件通知。我不想污染 IRep<T> 接口,因为这对存储库层之外的任何人都无关紧要。而其他类型的存储库可能根本不必担心这一点。
这有意义吗?
【问题讨论】:
标签: domain-driven-design repository inversion-of-control autofac