我应该如何在C#中实现我的存储库(DDD),以处理对同一聚合根的多个调用

我应该如何在C#中实现我的存储库(DDD),以处理对同一聚合根的多个调用,c#,domain-driven-design,repository,aggregate,ddd-repositories,C#,Domain Driven Design,Repository,Aggregate,Ddd Repositories,我的项目中的哪个类应该负责跟踪已经创建的聚合根,以便不为同一实体创建两个实例。我的存储库是否应该保留它创建的所有聚合的列表?如果是,我该怎么做?我是否使用单例存储库(我觉得不合适)?另一种选择是将这个“缓存”封装到其他地方,即其他类吗?这门课是什么样子的,适合什么样的模式 我没有使用O/R映射器,所以如果有一种技术可以处理它,我需要知道它是如何处理的(比如它使用什么模式)才能使用它 谢谢 >我认为缓存是发生在服务级别而不是存储库中的事情。存储库应该是“哑”的,只做基本的CRUD操作。服务可以足够

我的项目中的哪个类应该负责跟踪已经创建的聚合根,以便不为同一实体创建两个实例。我的存储库是否应该保留它创建的所有聚合的列表?如果是,我该怎么做?我是否使用单例存储库(我觉得不合适)?另一种选择是将这个“缓存”封装到其他地方,即其他类吗?这门课是什么样子的,适合什么样的模式

我没有使用O/R映射器,所以如果有一种技术可以处理它,我需要知道它是如何处理的(比如它使用什么模式)才能使用它


谢谢

>我认为缓存是发生在服务级别而不是存储库中的事情。存储库应该是“哑”的,只做基本的CRUD操作。服务可以足够智能,可以根据需要使用缓存(这可能更像是一种业务规则,而不是低级数据访问规则)

简单地说,我不让任何代码直接使用存储库——只有服务可以这样做。然后,其他一切都将相关服务作为接口使用。这为您提供了一个很好的包装,用于放入业务逻辑、缓存等。

我想说的是,如果这个“缓存”在存储库之外的任何地方进行管理,那么您就让问题泄漏出去了

存储库是您的项目集合。使用存储库的代码不必决定是从存储库还是从其他地方检索对象

单身听起来像是错误的一生;它可能应该是每个请求。如果您使用的是IoC/DI容器,那么这很容易管理


看起来,你甚至已经考虑过对同一个聚合的多个调用证明了一个架构/设计问题。我很想听听这些第一次和第二次呼叫可能是什么,以及为什么它们需要相同的AR实例。

我相信您正在考虑身份映射模式

在对模式的完整描述中(在他的书中),Fowler讨论了读/写实体(参与事务的实体)和只读(参考数据,理想情况下,这些数据应该只读取一次,然后缓存在内存中)的实现问题

我建议获得他的优秀著作,但描述这种模式的摘录可以在谷歌图书上阅读(寻找“福勒身份地图”)


基本上,标识映射是一个对象,例如在哈希表中存储从数据库加载的实体对象。映射本身存储在当前会话(请求)的上下文中,最好存储在工作单元中(对于读/写实体)。对于只读实体,映射不需要绑定到会话,可以存储在进程上下文中(全局状态)。

因此,如果对存储库的同一实例进行了两次相同聚合的调用,将创建并返回同一聚合的两个独立实例?是,但这些调用应该通过一个服务进行,该服务将在必要时缓存聚合实例。因此,在这种情况下,服务只会调用存储库一次,并在第二次请求时从缓存返回。但也会看到这个问题——有些人有不同的看法。我喜欢将缓存视为一种业务关注点,这样我的存储库就几乎没有依赖关系,但并不是每个人都这样看待它。这一点也是:)-当然-我们实际上是在幕后使用LINQ to SQL,它只处理我们在这方面的一个实例问题。我怀疑其他怪物也会为你做同样的事情。如果您想避免使用ORM,而只是复制持久化一个实例的模式,那么这里有一个L2S的高级功能:基本上,只需保留一个基于主键的字典或类似查找,并在从头构建对象之前检查它。你不能使用ORM有什么原因吗?那本书是我的。我要看一下身份图,看看是否合适。谢谢