在干净的体系结构中创建实体时如何为实体引发域事件

How to a raise a domain event for the entity when the entity is created in clean architecture

我有一个使用 clean architecture template 创建的项目。

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

如果我必须在项目中添加新项目时引发事件,我可以在 Project entity as shown here.

中完成

MarkCompletion of a ToDoItem as done here 类似。

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

一个选项是做类似 following in Create End Point here 的事情。

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

但这在 UI 中,远离域模型,因此感觉不对。

另一个选项是使用 ef core interceptors. So when ever save changes is called, just raise event as appropriate something like here

如果我在 Project ctor 中添加事件,即使有更新也会触发。

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

还有更好的options/patterns吗?

非常感谢任何指点。

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

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


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));
    }
}