0

我有一个使用干净架构模板创建的项目。

如果我想在创建新项目时引发域事件,我应该在哪里添加?

如果每当向项目中添加新项目时我必须引发事件,我可以在项目实体中完成该操作,如此处所示

与此处完成的 ToDoItem 的 MarkCompletion类似。

但不清楚在创建新项目时将代码放在哪里引发事件?

一种选择是在此处创建端点中执行以下操作。

    newProject.Events.Add(new ProjectCreatedEvent(newProject));

但这是在 UI 中,远离领域模型,所以感觉不对。

另一种选择是使用ef 核心拦截器。因此,当调用 save changes 时,只需根据需要引发事件,例如 here

如果我在 Project ctor 中添加事件,那么即使在更新的情况下也会触发。

      public Project(string name)
      {
        Name = Guard.Against.NullOrEmpty(name, nameof(name));
        
        var newProjectCreatedEvent = new NewProjectCreatedEvent(this);
        
        Events.Add(newProjectCreatedEvent);
      }

有没有更好的选择/模式?

任何指针都深表感谢。

4

1 回答 1

1

当您需要在项目创建时引发域事件时,我会创建一个发布事件的工厂方法。

您可以使用静态方法或实现工厂对象。


public class Project : BaseEntity, IAggregateRoot
{
    public static Project newProject(string name)
    {
        var project = new Project(name);
        
        var newProjectCreatedEvent = new NewProjectCreatedEvent(project);
    
        Events.Add(newProjectCreatedEvent);
        return project;
    }

    private Project(string name)
    {
      Name = Guard.Against.NullOrEmpty(name, nameof(name));
    }
}

于 2022-01-29T19:21:19.213 回答