Revo 是一个开源框架,适用于使用 Event Sourcing 、CQRS 和 DDD 构建的现代化 .NET 应用程序。.
• Domain-Driven Design
• Event Sourcing
• CQRS
• SOA
• Sagas
• 授权
• 多租户
• 数据访问
• 数据库迁移
• 审计

那么使用 Revo 编写程序的是什么样的呢? 下面是一个非常简单的 todo 示例。
Event
任务更新时的事件
public class TodoRenamedEvent : DomainAggregateEvent
{
public TodoRenamedEvent(string name)
{
Name = name;
}
public string Name { get; }
}
Aggregate
public class Todo : EventSourcedAggregateRoot
{
public Todo(Guid id, string name) : base(id)
{
Rename(name);
}
protectedTodo(Guid id) : base(id)
{
}
public string Name { get; private set; }
public void Rename(string name)
{
if (!Name != name)
{
Publish(new TodoRenamedEvent(name));
}
}
private void Apply(TodoRenamedEvent ev)
{
Name = ev.Name;
}
}
Command
public class CreateTodoCommand : ICommand
{
public CreateTodoCommand(string name)
{
Name = name;
}
[Required]
public string Name { get; }
}
CommandHandler
public class TodoCommandHandler : ICommandHandler<CreateTodoCommand>
{
private readonly IRepository repository;
public TodoCommandHandler(IRepository repository)
{
this.repository = repository;
}
public Task HandleAsync(CreateTodoCommand command, CancellationToken cancellationToken)
{
var todo = new Todo(command.Id);
todo.Rename(command.Name);
repository.Add(todoList);
return Task.CompletedTask;
}
}
Query
public class GetTodosQuery : IQuery<IQueryable<TodoReadModel>>
{
}
Query Handler
public class TaskQueryHandler : IQueryHandler<GetTodoQuery, IQueryable<TodoReadModel>>
{
private readonly IReadRepository readRepository;
public TaskListQueryHandler(IReadRepository readRepository)
{
this.readRepository = readRepository;
}
public Task<IQueryable<TodoReadModel>> HandleAsync(GetTodoListsQuery query, CancellationToken cancellationToken)
{
return Task.FromResult(readRepository
.FindAll<TodoListReadModel>());
}
}
ASP.NET Core controller
[Route("todos")]
public class TodoController : CommandApiController
{
[HttpGet("")]
public Task<IQueryable<TodoReadModel>> Get()
{
return CommandBus.SendAsync(new GetTodosQuery());
}
[HttpPost("")]
public Task Post([FromBody] CreateTodoDto payload)
{
return CommandBus.SendAsync(new CreateTodoCommand(payload.Name));
}
public class CreateTodoDto
{
public string Name { get; set; }
}
}
社区非常棒的并且成熟的 DDD 框架,感兴趣的同学可以学习一下。
https://github.com/revoframework/Revo