零度编程命令和查询责任分离 (CQRS) 模式( 三 )


以下代码显示了从 CQRS 实现(它对读取和写入模型使用不同的定义)的示例中提取的一些内容 。 模型接口不规定基础数据存储的任何功能 , 而且它们可以不断变化并进行细微调整 , 因为这些接口是独立的 。
下面的代码显示读取模型定义 。
// Query interface
namespaceReadModel
{
publicinterfaceProductsDao
{
ProductDisplay FindById( intproductId ) ;
ICollection FindByName( stringname ) ;
ICollection FindOutOfStockProducts( ) ;
ICollection FindRelatedProducts( intproductId ) ;
}
publicclassProductDisplay
{
publicintId { get; set; }
publicstringName { get; set; }
publicstringDeion { get; set; }
publicdecimalUnitPrice { get; set; }
publicboolIsOutOfStock { get; set; }
publicdoubleUserRating { get; set; }
}
publicclassProductInventory
{
publicintId { get; set; }
publicstringName { get; set; }
publicintCurrentStock { get; set; }
}
}
系统允许用户对产品制定费率 。 应用程序代码使用以下代码中所示的 RateProduct 命令执行此操作 。
publicinterfaceICommand
{
Guid Id { get; }
}
publicclassRateProduct: ICommand
{
publicRateProduct( )
{
this.Id = Guid.NewGuid;
}
publicGuid Id { get; set; }
publicintProductId { get; set; }
publicintRating { get; set; }
publicintUserId { get; set; }
}
系统使用 ProductsCommandHandler 类处理应用程序所发送的命令 。通常 , 客户端通过消息传递系统(如队列)将命令发送到域 。 命令处理程序接受这些命令 , 并调用域接口方法 。 每个命令的粒度旨在减少冲突请求 。 下面的代码显示了 ProductsCommandHandler 类的概述 。
publicclassProductsCommandHandler:
ICommandHandler< AddNewProduct>,
ICommandHandler< RateProduct>,
ICommandHandler< AddToInventory>,
ICommandHandler< ConfirmItemShipped>,
ICommandHandler< UpdateStockFromInventoryRecount>
{
privatereadonlyIRepository repository;
publicProductsCommandHandler( IRepository repository)
{
this.repository = repository;
}
voidHandle( AddNewProduct command)
{
...
}
voidHandle( RateProduct command)
{
varproduct = repository.Find(command.ProductId);
if(product != null)
{
product.RateProduct(command.UserId, command.Rating);
repository.Save(product);
}
}
voidHandle( AddToInventory command)
{
...
}
voidHandle( ConfirmItemsShipped command)
{
...
}
voidHandle( UpdateStockFromInventoryRecount command)
{
...
}
【零度编程命令和查询责任分离 (CQRS) 模式】}


推荐阅读