假设我有一个如下所示的 CQRS 命令:
public sealed class DoSomethingCommand : IRequest
{
public Guid Id { get; set; }
public Guid UserId { get; set; }
public string A { get; set; }
public string B { get; set; }
}
这是在以下命令处理程序中处理的:
public sealed class DoSomethingCommandHandler : IRequestHandler<DoSomethingCommand, Unit>
{
private readonly IAggregateRepository _aggregateRepository;
public DoSomethingCommand(IAggregateRepository aggregateRepository)
{
_aggregateRepository = aggregateRepository;
}
public async Task<Unit> Handle(DoSomethingCommand request, CancellationToken cancellationToken)
{
// Find aggregate from id in request
var id = new AggregateId(request.Id);
var aggregate = await _aggregateRepository.GetById(id);
if (aggregate == null)
{
throw new NotFoundException();
}
// Translate request properties into a value object relevant to the aggregate
var something = new AggregateValueObject(request.A, request.B);
// Get the aggregate to do whatever the command is meant to do and save the changes
aggregate.DoSomething(something);
await _aggregateRepository.Save(aggregate);
return Unit.Value;
}
}
我需要保存审计信息,例如“CreatedByUserID”和“ModifiedByUserID”。这是一个纯粹的技术问题,因为我的业务逻辑都不依赖于这些字段。
我在这里找到了一个相关的问题,其中有人建议引发一个事件来处理这个问题。这将是一种很好的方法,因为我还使用类似于此处描述的方法,基于从聚合引发的域事件来持久化更改。
(TL;DR:将事件添加到聚合中的每个操作的集合中,将聚合传递给Save
存储库中的单个方法,在该存储库方法中使用模式匹配来处理存储在聚合中的每个事件类型以持久保存更改)
喵喵时光机
相关分类