gpt4 book ai didi

c# - 在 DDD 中哪里调用 repository.update?

转载 作者:太空狗 更新时间:2023-10-29 17:33:19 24 4
gpt4 key购买 nike

我有一个真实的场景,是一个完美的领域模型设计。它是一个具有多个象限的字段,每个象限上的状态不同。所以我的聚合根是字段。现在我有一个重要的问题:我想要一个持久的忽略域模型,我认为这是有道理的。那么我应该在哪里调用存储库方法的更新?不在域模型中,对吗?那么当没有这个对象的更改跟踪代理并且不应在实体中调用存储库时,聚合根子实体应该如何在数据库中更新?还是我误解了领域模型模式?

我的问题清楚了吗? :)先感谢您最好月桂酸

最佳答案

So where should i call the update on the repository methods?

在典型的 DDD 架构中,存储库通常由应用程序服务 调用。应用程序服务是一个用作 facade 的类封装您的域并通过编排域对象、存储库和其他服务来实现域用例。

我不熟悉您的领域,但假设有一个用例将 StateField 中的一个 Quadrant 转移给另一个。如您所述,Field 是 AR。因此,您将有一个引用 FieldRepositoryFieldApplicationService:

public class FieldApplicationService
{
readonly FieldRepository fieldRepository;

public void ShiftFieldState(int fieldId, string quadrant, string state)
{
// retrieve the Field AR
var field = this.fieldRepository.Get(fieldId);
if (field == null)
throw new Exception();

// invoke behavior on the Field AR.
field.ShiftState(quadrant, state);

// commit changes.
this.fieldRepository.Update(field);
}
}

应用服务本身很薄。它不实现任何域逻辑;它仅协调和设置执行域逻辑的阶段,其中包括访问存储库。所有依赖于您的域的代码,例如表示层或服务,都将通过此应用程序服务调用域功能。

存储库可以通过多种方式实现。它可以与 NHibernate 等 ORM 一起使用,在这种情况下,更改跟踪是内置的,通常的方法是提交所有更改,而不是调用显式更新。 NHibernate 提供了一个 Unit of Work以及允许对多个实体的更改可以作为一个实体提交。

在您的情况下,正如您所说,没有更改跟踪,因此需要显式调用更新,并且由存储库实现来处理此问题。如果使用 SQL Server 作为数据库,存储库上的 Update 方法可以简单地将 Field 的所有属性发送到存储过程,该存储过程将根据需要更新表。

关于c# - 在 DDD 中哪里调用 repository.update?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14256186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com