ABP vNext 源码分析 - 5. DDD 的领域层支持 (仓储、实体、值对象)

一、简要介绍

ABP vNext 框架本身就是围绕着 DDD 理念进行设计的,所以在 DDD 里面我们能够见到的实体、仓储、值对象、领域服务,ABP vNext 框架都为我们进行了实现,这些基础设施都存放在 Volo.Abp.Ddd.Domain 项目当中。

本篇文章将会侧重于理论讲解,但也只是一个抛砖引玉的作用,关于 DDD 相关的知识可以阅读 Eric Evans 所编写的 《领域驱动设计:软件核心复杂性应对之道》。

PS:

该书也是目前我正在阅读的 DDD 理论书籍,因为基于 DDD 理论,我们能够精准地划分微服务的业务边界,为后续微服务架构的可扩展性提供坚实的基础。

1563360520996

Abp vNext 源码分析 - 4. 工作单元

一、简要说明

统一工作单元是一个比较重要的基础设施组件,它负责管理整个业务流程当中涉及到的数据库事务,一旦某个环节出现异常自动进行回滚处理。

在 ABP vNext 框架当中,工作单元被独立出来作为一个单独的模块(Volo.Abp.Uow)。你可以根据自己的需要,来决定是否使用统一工作单元。

异常吞噬问题一则

问题

在一个 Timer 时钟的周期方法内,有一个 foreach 循环,当执行到某些特定的语句时,会从头开始执行,而不会执行后续的语句。

分析

该问题我在初步分析之后,发现可能是由于程序出现了异常,但是被吞噬掉造成的。在我某一个 item 元素当中,其值为 null 应该会抛出空异常。但是没有异常抛出,后续我不知道哪个地方吞噬了异常,就在循环体内增加了一个 if 语句过滤掉了 null 元素。

使用 Polly 实现复杂策略(超时重试)

一、背景

第一次接触 Polly 还是在做某个微服务系统的时候,那时只会使用单一的超时策略与重试策略,更加高级的特性就没有再进行学习了。最近开为某个客户开发 PC 端的上位机的时候,客户有个需求,在发起请求之后如果 5 秒钟没有响应则进行重试,总共可以重试 3 次,如果 3 次请求都未返回数据,就视为请求失败。

关于 Polly 的高级用法可以参考官方的 Wiki 文档 即可,国内也有很多优秀的介绍文章,例如 这篇这篇

在 DotNetty 中实现同步请求

一、背景

DotNetty 本身是一个优秀的网络通讯框架,不过它是基于异步事件驱动来处理另一端的响应,需要在单独的 Handler 去处理相应的返回结果。而在我们的实际使用当中,尤其是 客户端程序 基本都是 请求-响应 模型,在发送了数据时候需要等待服务器的响应才能进行下一步操作,如果服务器返回的是错误信息,则需要进行特殊的处理。

类似于下面这种方式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public async void Button1_Click()
{
    var result = await DotNettyClient.SendData("Hello");
    
    if(result == "Error")
    {
        throw new Exception("服务器返回错误!");
    }
    
    Console.WriteLine($"Hello {result}");
}
Built with Hugo
主题 StackJimmy 设计