gpt4 book ai didi

design-patterns - DDD : Saving Changes to Model and accessing Repository

转载 作者:行者123 更新时间:2023-12-04 06:57:19 25 4
gpt4 key购买 nike

我有一个问题对象,它是问题聚合的根。该问题在其聚合中具有关联的答案实体。创建新的 Answer 对象时,更改将通过存储库保存到数据库中。我可以调用存储库方法 SaveAnswer(Question ID) 还是必须调用 SaveQuestion(QUestionID) 并让存储库确定所做的更改?如果是后者,这是如何实现的?

相反,如果我想加载特定问题的所有答案,我必须调用 GetQuestion() 然后提取答案,或者我可以简单地调用 GetAnswers(questionID)。

蒂亚

最佳答案

首先,让我说这里没有硬性规定,这是我对 DDD 和存储库访问的理解,但这是一个相当主观的领域...

因此,从 DDD 的角度来看,在向现有问题添加答案时,您可能想要执行的操作类似于以下 C# 样式的伪代码:

using(unitOfWork = new UnitOfWork())
{
var question = _questionRepository.GetQuestion(questionId);
question.AddAnswer(new Answer("blah"));
unitOfWork.SaveChanges();
}

假设您正在使用一个 ORM 来处理更改跟踪,并且配置为将子对象级联回数据库,这就是您需要做的所有事情(我在这里想到的是 NHibernate,但其他 ORM 可以在类似的环境中工作方式)。通过向问题添加答案,您已经告诉 ORM 您希望在工作单元完成时将答案保存在数据库中。您通常不会调用 SaveAnswer(QuestionId) - 这不是一种非常以 DDD 为中心的处理方式,其中 Answer 与 Question 在同一聚合中,而 Question 是聚合根。

为了从数据库中获取对象,通常您会向存储库询问问题对象(大概是通过 id),然后从那里导航到答案(通过问题的答案集合)- 例如

var question = _questionRepository.GetQuestion(questionId);
foreach(var answer in question.Answers)
{
Console.WriteLine(answer.Description); // or do something useful instead!
}

如果这看起来是一种保存或检索 Answer 对象的奇怪方式,那么您可能需要重新评估 Answer 是否确实属于同一个聚合,或者是否最好将其完全从问题聚合中分离出来.

关于design-patterns - DDD : Saving Changes to Model and accessing Repository,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/761630/

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