域层访问持久性的东西

Posted

技术标签:

【中文标题】域层访问持久性的东西【英文标题】:Domain Layer access to Persistence stuff 【发布时间】:2010-10-29 09:23:49 【问题描述】:

我试图让我的域层尽可能地“纯粹”,而不涉及持久性或其他基础架构问题。但是,有时我的域层需要使用 RDBMS 或其他外部依赖项的服务,我不知道如何处理。

例如,我的应用程序中的每个域对象都实现了一个 IValidatable 接口,客户端调用该接口以获取阻止对象被持久化的损坏规则列表。在少数情况下,上述验证例程涉及调用 DAO 类以检查特定记录的存在。我们没有使用 ORM;相反,我们使用使用数据访问对象模式构建的持久层。我应该围绕这个数据库访问创建一个服务/包装类并让我的域对象与之协作吗?添加这种间接级别是否可以接受,还是我仍在污染我的域对象?

【问题讨论】:

具体记录与域对象有什么关系? 【参考方案1】:

通常的答案是使用某种对象关系接口。您的领域层呈现您的领域模型的接口。你有一个关系数据库,你需要在它们之间有一个层来执行object-relational mapping。您说“我们没有使用 ORM”,但实际上您是:您只是直接在域层中进行映射。

制作该映射的问题称为object-relational impedance mismatch 问题。如果你坚持不明确ORM层,那么是的,你应该编写类来封装使用DBMS的细节,(当然,当你这样做时,你会在那里引入ORM类。)

确实,要避免一些 ORM 层是非常困难的。

【讨论】:

【参考方案2】:

我一直认为,您不能在持久域对象中隐藏持久性知识。尝试这样做变得越来越不自然,并引入了奇怪的副作用。 所以换句话说,我认为在领域层建立持久性知识是可以的,但不一定是持久性的确切方法;应该使用 DAO 接口。

我应该补充一点,根据您的验证检查,您会受到竞争条件的影响。您应该准备好处理因此可能发生的任何约束异常。

【讨论】:

以上是关于域层访问持久性的东西的主要内容,如果未能解决你的问题,请参考以下文章

如何使用持久性访问模式中存在的表

拒绝访问持久性 cookie

访问令牌持久性最佳实践 (iOS)

iOS 如何通过加密存储持久数据?

数据访问层

主席树的学习