.NET Core 开发实战
肖伟宇
校宝在线架构师、SkyWalking .NET 探针贡献者、NetCorePal 组件库创建者
20086 人已学习
新⼈⾸单¥59
课程目录
已完结/共 61 讲
第一章:必备知识 (25讲)
时长 06:28
时长 02:13
.NET Core 开发实战
登录|注册
留言
12
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 35 | MediatR:让领域事件处理更加优雅
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | .NET Core的现状、未来以及环境搭建
04 | Startup:掌握ASP.NET Core的启动过程
05 | 依赖注入:良好架构的起点
06 | 作用域与对象释放行为:你知道IDisposable对象释放的时机和坑吗?
07 | 用Autofac增强容器能力:引入面向切面编程(AOP)的能力
08 | 配置框架:让服务无缝适应各种环境
09 | 命令行配置提供程序:最简单快捷的配置注入方法
10 | 环境变量配置提供程序:容器环境下配置注入的最佳途径
11 | 文件配置提供程序:自由选择配置的格式
12 | 配置变更监听:配置热更新能力的核心
13 | 配置绑定:使用强类型对象承载配置数据
14 | 自定义配置数据源:低成本实现定制化配置方案
15 | 选项框架:服务组件集成配置的最佳实践
16 | 选项数据热更新:让服务感知配置的变化
17 | 为选项数据添加验证:避免错误配置的应用接收用户流量
18 | 日志框架:聊聊记日志的最佳姿势
19 | 日志作用域:解决不同请求之间的日志干扰
20 | 结构化日志组件Serilog:记录对查询分析友好的日志
21 | 中间件:掌控请求处理过程的关键
22 | 异常处理中间件:区分真异常与逻辑异常
23 | 静态文件中间件:前后端分离开发合并部署骚操作
24 | 文件提供程序:让你可以将文件放在任何地方
25 | 路由与终结点:如何规划好你的Web API
26 | 工程结构概览:定义应用分层及依赖关系
27 | 定义Entity:区分领域模型的内在逻辑和外在行为
28 | 工作单元模式(UnitOfWork):管理好你的事务
29 | 定义仓储:使用EF Core实现仓储层
30 | 领域事件:提升业务内聚,实现模块解耦
31 | APIController:定义API的最佳实践
32 | 集成事件:解决跨微服务的最终一致性
33 | 集成事件:使用RabbitMQ来实现EventBus
34 | MediatR:轻松实现命令查询职责分离模式(CQRS)
35 | MediatR:让领域事件处理更加优雅
36 | HttpClientFactory:管理向外请求的最佳实践
37 | gRPC:内部服务间通讯利器
38 | gRPC:用代码生成工具提高生产效率
39 | Polly:用失败重试机制提升服务可用性
40 | Polly:熔断慢请求避免雪崩效应
41 | 网关与BFF:区分场景与职责
42 | 网关与BFF:使用JWT来实现身份认证与授权
43 | 安全:反跨站请求伪造
44 | 安全:防开放重定向攻击
45 | 安全:防跨站脚本
46 | 安全:跨域请求
47 | 缓存:为不同的场景设计合适的缓存策略
48 | 部署:演示一个部署流程
49 | ConfigMap:实现基本配置方案
50 | 配置:使用分布式配置中心方案版本化管理配置
51 | 健康检查:与Liveness、Readiness、Startup探测集成实现高可用
52 | 健康检查:搭建全量健康检查探针和看板
53 | ForwardedHeaders:确保服务在负载均衡下正常工作
54 | 安全:介绍强制HTTPS的两种方式
55 | 日志:与EFK日志三件套集成
56 | 日志:Exceptionless日志系统
57 | 追踪:集成SkyWalking .NET实现追踪
58 | 监控与告警:Prometheus与AlertManager
59 | 监控与告警:用Granfana实现监控看板
60 | prometheus-net:自定义监控指标利器
61 | 结课测试&结束语
本节摘要
登录 后留言

全部留言(12)

  • 最新
  • 精选
SuperSnow
老师好,对于IPipelineBehavior接口中的Handle方法,由于该方法会对所有event事件的处理方法都会拦截,有没有什么注解可以标注不拦截的。因为在进行select请求操作时,没必要还加事务控制,所以有没有什么方法可以取消?

作者回复: 可以为查询的Request类型标注特定的Attribute或者接口,在PipelineBehavior识别并跳过

2020-03-11
2
mars
在实现领域驱动一书中一再强调不要在应用层处理副作用,因为会有事务问题,所以是不是应该都通过领域事件放到eventbus然后异步处理?

作者回复: 是这样的,但并不是所有的“副作用"都需要通过eventbus传递,有一部分领域事件,仅仅在领域内发生作用,则不需要通过eventbus,通过MediatR在进程内处理即可

2020-05-04
1
请问老师两个问题 1.多个订阅处理器是异步执行吗?我指的异步不是async。 2.如果事件处理器中有异常如何提示出来?

作者回复: 你特别指出是异步,不是async,那说明你期望命令的处理不等待事件处理器的处理,那就需要每个处理器来自己处理异常了,这种情况CAP组件能够很好的处理这种情况

2020-04-21
1
提姆
老师你好,有两点想请问一下 1. 领域事件的处理是不是尽可能不要有相依性,而是自己独立完成一件事情呢 2. 有关MediatR实作Handler的部分,有关数据库的读取是否要加上async await? 还是其实没有差呢

作者回复: 1.是的,领域事件的处理应该专注于一个业务目的,多个影响可以分多个handler。 2.建议尽量使用async await的方式,避免同步异步代码混用。

2020-04-09
2
1
任高良
老师你好,下面的场景,如何使用领域事件进行优雅地处理呢? 用户注册成功之后做两件事情:1、创建一个新的购物车;2、发放新用户注册100元优惠券到账户中。 注:用户注册、购物车、优惠券这些功能在一个项目中,并且使用的同一个数据库。 我的思考是: 在用户注册成功之后发布UserRegisteredDomainEvent事件,然后在系统中写2个handler,分别处理“新建购物车”和“发放优惠券”这两件事情。 但是看到老师的代码中,对于OrderCreatedDomainEvent只有一个领域事件的handler,其逻辑是发布一个集成事件,所以我比较疑惑: 我应该在集成事件处理器里做这两件事还是在领域事件处理器里做这两件事呢? 如果一个事件被多个handler订阅,对于处理器的命名有没有什么约定和建议呢? 谢谢老师解答~

作者回复: 你的理解是对的,应该定义新用户注册领域事件的优惠券发放handler,来处理优惠券的发放。 集成事件的目的是将事件传播给其它的微服务,它本质上也是为了传递领域事件。 领域事件处理handler一般会组织到以各自聚合根命名的目录下,用以区分。

2020-03-03
2
1
石马猿
感觉老师的内容确实不错,挺用心准备的,但是英文发音不敢恭维,内容这么好,发音拖后踢了,😳

作者回复: 感谢提醒,努力改进中

2021-01-21
stg609
Domain event handler 放在应用层的考虑是什么?

作者回复: Event Handler是处理业务副作用的逻辑,本质上与用户发起的命令是一样的,只是它的发起是由事件驱动的,因此与命令处理Handler处于同层。

2020-02-29
5
木风
肖老师,请问DispatchDomainEventsAsync是通过判断领域实体内是否有事件产生,有则发布,对吧?如果是这样,是不是意味着这DispatchDomainEventsAsync需要循环被调用,不断地扫描看是否有新事件产生? 如果是的话,这任务又在哪里被循环调用了? 谢谢

作者回复: DispatchDomainEventsAsync仅在领域模型持久化保存时触发,这时它会对领域模型里记录的事件进行处理,不会不断地主动扫。

2020-02-27
2
在大量请求时会发送很多命令,使用mediatr 会造成消息阻塞吗?
2020-08-22
1
小庞
IPipeLineBehavior只能用于处理IRequestHandler,不能用于处理INotificationHandler https://github.com/jbogard/MediatR/wiki/Behaviors The pipeline behaviors are only compatible with IRequestHandler<TRequest,TResponse> and can't be used with INotificationHandler<TRequest>.
2020-07-09
1
收起评论