【发布时间】:2011-08-11 16:14:53
【问题描述】:
我正在学习 DDD(领域驱动设计)和存储库模式(在 C# 中)。我希望能够使用存储库模式来持久化实体,而不关心实际使用的是哪个数据库(Oracle、MySQL、MongoDB、RavenDB 等)。但是,我不确定如何处理大多数(全部?)数据库使用的特定于数据库的 id。例如,RavenDB 要求它应该存储的每个实体都有一个字符串类型的 id 属性。其他可能需要 int 类型的 id 属性。由于不同的数据库对此的处理方式不同,因此我无法将数据库 id 作为实体类的一部分。但它必须在某个时候存在,至少在我存储实际实体时。我的问题是这方面的最佳做法是什么?
我目前追求的想法是,对于我想要支持的每个数据库,为每个业务对象类型实现数据库特定的“值对象”。然后,这些值对象将具有数据库特定的 id 属性,并且我将在读取和写入时在两者之间进行映射。这看起来是个好主意吗?
【问题讨论】:
-
你真的需要它吗?对我来说似乎不是一个好主意,因为你会遇到维护地狱。
-
我也面临同样的问题。不幸的是,这里提到的解决方案都没有把我称为“完美的解决方案”(如果有的话......)。我还考虑过在数据抽象层中转换为特定的实现类型。我的意思是,虽然
DTOs 和DAOs 是所有 DB 类型共有的接口,但任何特定的DAO实现都会将其方法中的DTOs 转换为相同的特定实现类型(我是假设一次只使用一种 DB 类型)。这样,它将能够使用特定的ID。它看起来很脏,但这是我迄今为止想出的最好的。 -
我刚刚发现了另一个关于类似问题的问题,有一个答案似乎也可以在这里工作。看看:stackoverflow.com/questions/10785598/…
标签: c# database domain-driven-design repository