【说明:博主采用边写边思考的方式完成这一系列的博客,所以代码以附件为准,文中代码仅为了说明。】
结构
在学习和实现CQRS的过程中,首要参考的项目是这个【http://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html】。所以Dpfb.Cqrs中的整体结构都是参考这个例子来的,在这个基础之上添加和改进。总的来说,.Cqrs项目的整体结构如下所示:
主要包含了(命令,事件,通信,命令处理,事件处理这几个方面)。具体的角色则如下图所示:
通信中包含了事件总线和命令总线。由于查询入口(QueryEntry)如何处置暂时没想好,所以先放一个文件夹卖萌。
实现
此时的目标是实现一个最小单元的CQRS(主要是命令和事件部分)。其中命令总线和事件总线的实现比较固定,他们的职责就是为命令和事件找到对应的处理类,然后依次调用对象的接口方法,从而将一般的直接调用“打断”,同时提供各种额外操作的注入点。为了更好的控制他们如何寻找处理类,这里引入两个接口ICommandHandlerSearcher以及IEventHandlerSearcher。放在项目的Configuration名称空间下面。现在,可以为这些接口提供一个基础的实现,供测试使用。以下是接口定义:
public interface ICommand
{
Guid Id { get; set; }
}
public interface IEvent
{
Guid Id { get; set; }
}
public interface IEventHandler<T> where T : IEvent
{
void Handle(T @event);
}
public interface ICommandHandler<T> where T: ICommand
{
void Execute(T command);
}
public interface ICommandBus
{
void Send<T>(T command) where T : ICommand;
}
public interface IEventBus
{
void Publish<T>(T @event) where T : IEvent;
}
public interface ICommandHandlerSearcher
{
ICommandHandler<T> Find<T>() where T : ICommand;
}
public interface IEventHandlerSearcher
{
IEnumerable<IEventHandler<T>> Find<T>() where T : IEvent;
}