在干净的体系结构中创建实体时如何为实体引发域事件
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));
}
}
我有一个使用 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));
}
}