Dav*_*all 5 c# database domain-driven-design repository
我正在学习 DDD(域驱动设计)和存储库模式(在 C# 中)。我希望能够使用存储库模式来持久化一个实体,而不关心实际使用的是哪个数据库(Oracle、MySQL、MongoDB、RavenDB 等)。但是,我不确定如何处理数据库特定的 id:s 大多数(全部?)数据库使用。例如,RavenDB 要求它应该存储的每个实体都有一个字符串类型的 id 属性。其他可能需要 int 类型的 id 属性。由于这由不同的数据库以不同的方式处理,因此我无法将数据库 ID 设为实体类的一部分。但它必须在某个时候存在,至少在我存储实际实体时是这样。我的问题是关于此的最佳实践是什么?
我目前追求的想法是,对于我想要支持的每个数据库,为每个业务对象类型实现特定于数据库的“值对象”。这些值对象将具有数据库特定的 id 属性,我将在读取和写入时在两者之间进行映射。这看起来是个好主意吗?
您可以在实体中拥有 ID,但不能将其公开为实体公共接口的一部分。NHibernate 可以实现这一点,因为它允许您将表列映射到私有字段。
所以你可能会有类似的东西
class Customer {
private readonly Int32? _relationalId;
private readonly String? _documentId;
...
Run Code Online (Sandbox Code Playgroud)
这并不理想,因为您的持久性逻辑会在业务逻辑上“渗透”,但考虑到需求,它可能比在实体外部的某处维护实体与其 id 之间的映射更容易、更健壮。我还强烈建议您评估“与数据库无关”的方法,如果您只想支持关系数据库,这种方法会更现实。在这种情况下,您至少可以在存储库实现中重用像 NHibernate 这样的 ORM。大多数关系数据库都支持相同的 id 类型。在您的场景中,您不仅需要 ORM,还需要诸如“对象文档映射器”之类的东西。我可以看到您将不得不编写大量的基础设施代码。我强烈建议您重新评估您的需求并在关系数据库和文档数据库之间进行选择。阅读本文:基于文档的数据库与关系数据库的优缺点
| 归档时间: |
|
| 查看次数: |
1107 次 |
| 最近记录: |