2

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

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

4

2 回答 2

2

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

进行该映射的问题被称为对象关系阻抗失配问题。如果你坚持不明确 ORM 层,那么是的,你应该编写类来封装使用 DBMS 的细节,(当然,当你这样做时,你会在那里引入 ORM 类。)

确实,很难避免使用一些ORM 层。

于 2009-05-27T19:57:46.127 回答
1

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

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

于 2010-07-02T16:19:22.737 回答