领域驱动开发和sql索引

问题描述 投票:0回答:1

我在 WebApi 应用程序中 DDD 模型的持久性方面遇到一些问题。

输出“堆栈”:

  • Web .net 核心应用程序
  • DD
  • sql(Dapper 不是 ef core)

为了简单起见,我们有简单的 DDD 实体模型,让我们假设这就是全部

public class Car {
    public VIM Vim;
    // some value objects
}

据我所知,VIM 是独一无二的,所以它将作为 DDD 模型的身份。

我想将它存储在一个简单的 SQL 表中,其中 VIM 列为 varchar。 由于 VIM 的唯一性,它会工作得很好,我可以使用它作为主键,每当我想存储或检索(然后创建)我的 DDD 模型时,我都可以通过 VIM 来做到这一点。

另一方面,通过 varchar 值搜索效率不高,因此简单的 ID(索引)对于我们的 CRUD Web 应用程序来说很方便。

如果我们希望 DDD 模型保持纯粹,它应该独立于任何持久性信息。

虽然我们想为我们的汽车创建记录,但它会起作用,因为 ID 将在没有模型知识的情况下生成,删除也是如此,因为我们从 api 请求中获取了 ID。

对我来说唯一的问题是更新操作。 流程看起来像这样: 通过 ID 检索 Db 记录(来自请求) -> 从我们的持久层创建 DDD 模型 -> 对我们的 DDD 模型执行更新操作

如何执行最后一步 - 保存更改?因为当我们构建 DDD 模型时,我们失去了 Id(我们希望模型是纯粹的)。我应该执行操作,但 udpate 查询中应该有 VIM 吗?或者我应该将 sql ID 保留在持久层/应用程序层范围内吗?

sql .net sql-server domain-driven-design
1个回答
0
投票

我注意到你的问题中有两个问题。

  • 如果您的应用程序是基于 CRUD 的应用程序,也许您应该避免使用 DDD。这会太过分了。
  • 第二个引用了这句话:“从我们的持久层创建一个 DDD 模型”。从持久数据映射对象不需要经过业务规则和验证。这意味着它不需要调用用于创建域对象的相同构造函数。因为验证在持久化数据之前发生过一次。我认为这个问题来自于使用 Dapper 作为 ORM。像 EF 和 NHibernate 这样的 ORM 不需要公共构造函数来创建映射对象。
© www.soinside.com 2019 - 2024. All rights reserved.