[设为首页] [加入收藏]
王中王开奖记录,香港马会开奖结果直播,338822开奖结果,www.4044222.com,www.858448i.com
网站首页 王中王开奖记录 香港马会开奖结果直播 338822开奖结果 www.4044222.com www.858448i.com
您的当前位置:主页 > www.4044222.com >  
Core中实现单体程序的事件发布订阅 - LamondLu - 博客园
2019-08-08 18:52    来源: 未知      点击:

  事件发布/订阅是一种非常强大的模式,它可以帮助业务组件间实现完全解耦,不同的业务组件只依赖事件,只关注哪些事件是需要自己处理的,而不用关注谁来处理自己发布事件,事件追溯(Event Sourcing)也是基于事件发布/订阅的。在微服务架构中,事件发布/订阅有非常多的应用场景。今天我给大家分享一个基于Core的单体程序使用事件发布/订阅的例子,针对分布式项目的事件发布/订阅比较复杂,难点是事务处理,后续我会另写一篇博文来演示。

  当前我们有一个基于ASP.NET Core的电子商务系统,在项目的初期,业务非常简单,只有一个购物车模块和一个订单模块,所有的代码都放在一个项目中。

  根据SOLID设计原则中的单一责任原则,如果一个类承担的职责过多,就等于把这些职责耦合在一起了。这里生成订单和发送邮件都不应该是当前SubmitShoppingCart需要负责的,所以我们需要它们从这个方法中移出去,使用的方法就是事件订阅/发布。

  这里我们首先定义一个事件基类,其中暂时只添加了一个属性OccuredOn,它表示了当前事件的触发时间。

  为了添加事件处理器,我们首先需要定义一个泛型接口类IEventHandler

  这个泛型接口类的是泛型类型必须继承自EventBase类。接口提供了2个方法Run和RunAsync。 它们定义了该接口的实现类必须实现同一个处理逻辑的同步和异步方法。

  有了事件处理器接口,接下来我们就可以开始为购物车提交事件添加事件处理器了。这里我们为了实现前面定义的逻辑,我们需要创建2个处理器CreateOrderHandler和ConfirmEmailSentHandler

  下面我们来编写最核心的事件处理器容器。在这里我们的事件处理器容器完成了3个功能

  现在我们来Startup.cs的ConfigureServices方法,这里我们需要进行服务注册,并完成事件订阅。

  注意:这里保证一个Api请求中的所有数据库操作在一个事务里,这里我们使用Scoped作用域。这样我们就可以在调用工作单元IUnitOfWork接口的Save代码中启用事务。

  注意:这里保证一个Api请求中的所有数据库操作在一个事务里,这里我们使用Scoped作用域。这样我们就可以在调用工作单元IUnitOfWork接口的Save代码中启用事务。

  最后我们来修改ShoppingCartManager, 改用发布事件的方式来完成后续创建订单和发送邮件的功能。

  这样ShoppingCartManager就只需要关注购物车状态的变更,而不需要关注发送确认邮件和创建订单了。

  至此我们的代码重构完成。 最终的代码中,SubmitShoppingCart方法,仅负责修改购物车状态并发布一个购物车提交的事件。生成订单和发送邮件的功能代码都被移动到了独立的处理类中。

  这样的方式的好处不仅仅是完成了代码的解耦,针对后续的扩展也非常有利,想想一下,如果在未来当前项目需求追加这样一个功能,当提交购物车的时候,除了要发送确认邮件,还要发送手机短信。这时候你根本不需要去修改ShoppingCartManager类,你只需要针对ShoppingCartSubmittedEvent在再添加一个新的事件处理器即可,这也满足的SOLID的开闭原则。

 推荐新闻
 酷图热图
Core中实现单体程序的事件发布订阅 - LamondLu - 博客园
Core中实现单体程序的
如何下载到网站的asp文件
如何下载到网站的asp
下载了一个网站ASP源码怎么打开
下载了一个网站ASP源
哪儿有博客的asp源代码下载啊?
哪儿有博客的asp源代
 热点文章
Copyright © 2002-2011 DEDECMS. 织梦科技 版权所有 Power by DedeCms