【说明:博主采用边写边思考的方式完成这一系列的博客,所以代码以附件为准,文中代码仅为了说明。】

结构

在学习和实现CQRS的过程中,首要参考的项目是这个【http://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html】。所以Dpfb.Cqrs中的整体结构都是参考这个例子来的,在这个基础之上添加和改进。总的来说,.Cqrs项目的整体结构如下所示:

CQRS学习——最小单元的Cqrs(CommandEvent)[其一]

主要包含了(命令,事件,通信,命令处理,事件处理这几个方面)。具体的角色则如下图所示:

CQRS学习——最小单元的Cqrs(CommandEvent)[其一]

通信中包含了事件总线和命令总线。由于查询入口(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;
    }
接口定义

相关文章: