enode框架入门:事件驱动架构(EDA)思想的在框架中如何体现2013-11-26 博客园 netfocus开源地址:https://github.com/tangxuehua/enode上一篇文章,我给大家分享了我的一个基于DDD 以及EDA架构的框架enode,但是只是介绍了一个大概。接下来我准备用很多一篇篇详细但不冗长的文章介绍每 个点。尽量争取一次不介绍太多内容,但希望每次介绍完后都能让大家知道这个小点的设计思想,以及为了解 决的问题。好了,这篇文章,我主要想介绍的是EDA思想在enode框架中如何体现?
经典DDD的基 于领域服务的实现方式一般的应用程序,如果一个用户动作会涉及多个聚合根的修改,我们通常会在 应用层服务中创建一个unit of work,然后,我们可能会设计一个领域服务类,在该领域服务类里,修改多个 聚合根,然后应用层服务将整个unit of work中的修改一次性以事务的方式提交到数据库。这种方式就是以事 务的方式来实现涉及多个聚合根修改的强一致性。以银行转账这个经典的场景作为分析案例:
public interface IBankAccountService{void TransferMoney(Guid sourceBankAccountId, Guid targetBankAccountId, double amount);}public class BankAccountService : IBankAccountService{private IContextManager _contextManager;private TransferMoneyService _transferMoneyService;public BankAccountService(IContextManager contextManager, TransferMoneyService transferMoneyService){_contextManager = contextManager;_transferMoneyService = transferMoneyService;}public void TransferMoney(Guid sourceBankAccountId, Guid targetBankAccountId, double amount){using (var context = _contextManager.GetContext()){var sourceAccount = context.Load<BankAccount>(sourceBankAccountId);var targetAccount = context.Load<BankAccount>(targetBankAccountId);_transferMoneyService.TransferMoney(sourceAccount, targetAccount, amount);context.SaveChanges();}}}
一次银行转账,最核心的动作就是源账号转出钱,目标账号转入钱;当然实际的银行转账肯定 不是这么简单,也肯定不是这么实现。我拿这个作为例子只是为了通过这个大家都熟知的简单例子来分析如果 一个用户场景涉及不止一个聚合根的修改的时候,如果基于经典的DDD的方式,我们是如何实现的。如上面的 代码所示,我们可能会设计一个应用层服务,如上面的IBankAccountService,该应用层服务里有一个 TransferMoney的方法,表示用于实现银行转账的功能;然后该应用层服务会进一步调用一个领域层的转账领 域服务,就是上面代码中的TransferMoneyService,按照Eric Evans所说,领域服务应该是一个以动词命名的 服务,一个领域服务可以明确对应到领域中的一个有业务含义的领域动作,此例就是“转账”,所以我设计了 一个TransferMoneyService的以动词来命名的领域服务,该服务的TransferMoney方法实现了银行转账的核心 业务逻辑。上面这个例子中,按照经典DDD,我们应该在应用层实现流程控制逻辑以及事务等东西;所 以大家可以看到,以上代码中,我们是先获取一个unit of work,即上面代码中的context,最后调用 context.SaveChanges方法,该方法的职责就是将当前上下文的所有修改以事务的方式提交到数据库。好了, 上面这个例子我们分析了经典DDD关于如何实现一个会涉及多个聚合根新建或修改的用户场景;