CQRS体系结构模式实践案例【Tiny Library对象的行为和状态】

本文探讨了在CQRS(命令查询责任分离)架构模式中,对象状态如何通过事件驱动发生变化。传统的对象状态更新方式在CQRS中被避免,转而采用事件源(Event Sourcing)的概念,使得对象状态只能通过事件的发生而改变,增强了系统的可追溯性和事件驱动特性。通过实例展示了实体如何捕获并处理事件以更新状态,强调了行为在状态变化中的作用。
摘要由CSDN通过智能技术生成

从结构上看,tlibcqrs项目并不复杂,但对其进行介绍,的确让我感到有点无从着手。还是先从领域模型中的对象的行为和状态谈起吧。

先来谈谈对象状态。据我理解,状态就是一种数据,它用来描述,在某个特定的时间上,这个对象所具有的特质,它将作为对象行为发生的依据和结果。我们平时做设计和编程的时候,尤其是在做数据访问层的时候,特别喜欢一些仅仅包含getter/setter属性的对象,以便调用方能够通过getter获得对象的状态,使用setter设置对象的状态。之前我也说明过,状态并非getter/setter属性,在OOP上,状态表现为“字段”(fields)。现在我们讨论的不是数据访问层的DAO,而是领域模型中的实体。当然,实体也是对象,自然也有状态,不仅仅是状态,实体是参与业务逻辑的重要对象,它还有处理业务逻辑的行为。

现在假设我们有个实体为Customer,它同时也是某个聚合的聚合根,在通常情况下,我们会用下面的形式去定义这个Customer实体(为了简化,省去了对象行为):

image

当然你不会觉得这样设计有什么太大的问题,事实上在我们平时的开发中,也的确是这么做的,而且非CQRS架构的DDD实践也支持这样的实体模型。于是,我们可以使用下面的代码来更新某个Customer的姓名:

   1: [TestMethod]
   2: public void ChangeCustomerNameTest()
   3: {
   
   4:     Customer customer = new Customer
   5:     {
   
   6:         Birth = DateTime.Now.AddYears(-20),
   7:         Email = "daxnet@live.com",
   8:         FirstName = "dax",
   9:         LastName = "net",
  10:         Password = "123456",
  11:         Username = "daxnet"
  12:     };
  13:     using (IRepositoryContext ctx = ObjectContainer.Instance.GetService<IRepositoryContext>())
  14:     {
   
  15:         IRepository<Customer> customerRepository = ctx.GetRepository<Customer>();
  16:         customerRepository.Add(customer);
  17:     }
  18:     ISpecification<Customer> spec = Specification<Customer>.Eval(p => p.Username.Equals("daxnet"));
  19:     using (IRepositoryContext ctx = ObjectContainer.Instance.GetService<IRepositoryContext>())
  20:     {
   
  21:         IRepository<Customer> customerRepository = ctx.GetRepository<Customer>();
  22:         var customer2 = customerRepository.Get(spec);
  23:         Assert.AreEqual(customer.Username, customer2.Username);
  24:  
  25:         customer2.FirstName = "qingyang";
  26:         customer2.LastName = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值