gpt4 book ai didi

domain-driven-design - 如何更新聚合内的实体

转载 作者:行者123 更新时间:2023-12-05 08:02:27 27 4
gpt4 key购买 nike

我有一个名为 Campaigns 的聚合,每个聚合都有一个名为 campaign 的根实体,这个根实体有一个尝试列表(实体)

    public class Attempts: IEntity<Attempts>
{
private int id;
public AttempNumber AttemptNumber {get;}
//other fields
}

public class Campaign: IEntity<Campaign> //root
{
private int id;
public IList<Attempt> {get;}
//other fields
}

我正在使用一种方法来添加事件尝试

 public virtual void AssignAttempts(Attempts att)
{
Validate.NotNull(att, "attemps are required for assignment");

this.attempts.add(att);
}

当我尝试编辑尝试列表中的特定项目时出现问题。我通过 AttempNumber 获取 Attempt 并将其传递给 editAttempt 方法,但我不知道如何在不删除整个列表并重新创建它的情况下设置尝试

 public virtual void EditAttempts(Attempts att)
{
Validate.NotNull(att, "attemps are required for assignment");
}

任何帮助将不胜感激!

谢谢,佩德罗德拉克鲁斯

最佳答案

首先,我认为您的域模型可能存在一些小问题。在我看来,“Campaign”应该是一个聚合根实体,具有“Attempt”值对象(或实体)的集合。除非您有包含一系列事件的事件的父概念,否则没有“事件”聚合。此外,没有“尝试”实体。取而代之的是“尝试”实体或“事件”实体上的值的集合。如果“尝试”在“事件”之外具有身份,则它可能是一个实体,否则它是一个值对象。代码可能是这样的:

class Campaign {

public string Id { get; set; }

public ICollection<Attempt> Attempts { get; private set; }

public Attempt GetAttempt(string id) {
return this.Attempts.FirstOrDefault(x => x.Number == id);
}

}

class Attempt {
public string Number { get; set; }
public string Attribute1 { get; set; }
}

如果您从 Campaign 实体中检索 Attempt 然后更改某些属性,则不必将其重新插入到 Campaign 实体中,它已经存在了。如果您使用 NHibernate(与其他 ORM 类似),代码将是这样的:

var campaign = this.Session.Get<Campaign>("some-id");

var attempt = campaign.GetAttempt("some-attempt-id");

attempt.Attribute1 = "some new value";

this.Session.Flush(); // will commit changes made to Attempt

关于domain-driven-design - 如何更新聚合内的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6617884/

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