gpt4 book ai didi

cqrs - 如何处理事件源中已删除的事件类

转载 作者:行者123 更新时间:2023-12-04 01:53:20 25 4
gpt4 key购买 nike

我正在尝试实现一个纯事件源服务,以查看我会在哪里遇到问题。现在我发现了一个我至今无法解决的问题,所以我想就此展开讨论。

给定以下聚合:

class User
{
public Guid Id { get; private set; }

public string Name { get; private set; }

public void Apply(UserNameChangedEvent domainEvent)
{
Name = domainEvent.NewName;
}


public void Apply(UserCreatedEvent domainEvent)
{
Name = domainEvent.Name;
Id = domainEvent.Id;
}
}

和那些领域事件
class UserCreatedEvent
{
public string NewName { get; }
public Guid Id { get; }

public UserCreatedEvent(string newName, Guid id)
{
NewName = newName;
Id = id;
}
}

class UserNameChangedEvent
{
public string NewName { get; }

public UserNameChangedEvent(string newName)
{
NewName = newName;
}
}

假设我创建了一个用户并在之后将其名称更改为“Peter”,然后我有一个 UserCretedEvent和一个 UserChangedNameEvent坚持在我的 EventStore 中。现在该公司表示无法再更改名称,因此我将删除类 UserChangedNameEvent以及处理它的函数。但是现在我遇到的问题是,我无法以正确的状态重新创建聚合,即名称为“Peter”的聚合。

当然,我可以开始修改并将函数和类标记为已弃用,这样我就可以继续使用它,但之后我可能会得到很多事件类,这将是一个需要跟踪的噩梦。我还听说您可能会创建一个新事件来保持域中的更改,但这对我来说似乎也很hacky 并且不是一种很好的风格,因为在我看来这不是域事件。

所以问题是,我如何最好地处理这样的变化?

编辑:只是为了澄清:我不想删除任何事件,只想删除我使用它的类和函数,因为现在的要求不同了。

最佳答案

与事件模式更改相关的问题的资源是 Versioning in an Event Sourced System ,由格雷格·杨。

So the question is, how do I deal the best with changes like this?



这取决于您要解决的实际问题。

如果要求是将来不允许用户更改他们的名字,那么您可以去掉域模型中创建新 UserNameChangedEvent 的逻辑。 s,但在事件确实出现的地方留下正确的处理。

如果要求忽略对用户名的更改,那么您还可以使用 Apply(UserNameChanged)处理程序并将其转换为 NoOp,就像处理任何其他无法识别的事件一样。

如果要求是销毁有关名称更改的信息,则将事件存储迁移到新模式,该模式不再包含 UserNameChanged事件。

如果您将状态存储在 RDBMS 中,思考如何解决问题可能会有所帮助:忽略用户名列是否足够?你需要删除列吗?您是否需要(以某种方式)将列中的值恢复为先前写入的值?

了解与您要在事件存储中解决的问题类似的传统数据库中的问题应该有助于确定适当的解决方案。

另外:请注意您的域模型是否是需要更改的数据的记录系统,或者您是否正在缓存由不同机构发布的信息表示。

关于cqrs - 如何处理事件源中已删除的事件类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51961148/

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