有人说:“CQRS很难!”
是吗? 好吧,我也曾如许以为! 但,当我Start运用 CQRS 编写我的第一个软件时,它很快就不攻自破。更加主要的是,我以为从久远来看,以这类方法保护软件愈加轻易。
我Start考虑:为什么人们在一Start时以为它是何等艰苦难和庞杂? 我有一个实际:它包括规矩! 进入具有规矩的天下老是不舒适的,我们需求适应这些规矩。在这篇文章中,我想证实在这类状况下,这些规矩长短常易于了解的。
从基本上来讲,我们可以将 CQRS 视为对软件架构号令查询别离规矩的完成。在运用此办法的任务中,我留意到在最容易的 CQS 完成与真正成熟的 CQRS 之间有几个步调。我想那些步调可以顺遂地引入我之前曾经提到的规矩。
固然第一步没有完成我对 CQRS 的定义(可是有时分这么称谓的),可是他们还可认为你的软件引入一些真实的价值。每一个步调都引入一些风趣的设法,可以有助于构建或清算你的代码库/架构。
凡是,我们的路程从这里Start:
我们可能都晓得,这是一个典范的 N-层架构。假如我们想在这添加一些 CQS,我们可以“容易地”将营业逻辑层别离为号令和查询:
假如你还在运用老式代码库,这多是最难的一步,就像从意大利面式代码中浏览别离出反作用一样不容易。同时这个步调可能也是最有益处的一个;它会给你一个反作用履行的地位的概述。
等一下!你正在会商 CQS,CQRS ,可是你还没有定义究竟甚么是号令或查询!
没错。我们Start定义它们吧!在这里,我会给你我个人、直观的对号令和查询的定义。它其实不全面,并且在完成之前必需加以深化。
号令——起首,触发号令是独一改动系统形态的办法。号令担任惹起一切的对系统的改动。假如没有号令,系统形态坚持稳定!号令不该该前往任何值。我运用两个类来完成它:Command 和 CommandHandler 。Command 只是一个通俗的工具,CommandHandler 将它用于表现某些操作的输出值(参数)。我以为号令是容易地挪用范畴模子中的特定操作(纷歧定是每一个号令都有的操作)。
查询——异样的,查询是一个读操作。它读取系统的形态,过滤,聚总,和转换数据,并将其转化为最有效的格局。它可以履行屡次,并且不会影响系统的形态。我之前是运用一个有一些 Execute(…) 函数的类来完成它,可是如今我以为别离成 Query 和 QueryHandler/QueryExecutor 可能会更有效。
回到表示图,我需求廓清一些工作;我曾经隐蔽地做了一个弥补修正,模子改成范畴模子。因为我以为模子是一组数据容器,而范畴模子包含了营业规矩中实质庞杂性。由于我们对这里的系统架构感兴味,这个修正不会间接影响我们的进一步思索。可是值得一提的是,虽然号令担任改动系统的形态,实质庞杂性应当放到范畴模子。
好的,如今我们可以添加新的号令或许编写新的查询。短工夫内,很分明,实用于写的范畴模子其实不必定合适读。从某种特别模子中更轻易读取数据,这并非一个严重的发明:
我们可以引入别离模子,由 ORM 映照并构建查询,可是在某些状况下,特殊是当 ORM 引入开支时,它将对简化构造有所协助。
我以为这个特别的改动该当被好好地思索!
如今的问题是我们依然有仅在逻辑层级上别离的读和写模子,由于他们同享公共数据库。这就意味着我们曾经别离了读模子,但最有多是被一些 DB 视图给虚拟化了,物化视图的状况下更好。假如我们的系统没有功能问题,而且我们记着在写模子改动的时分更新查询,那这个计划是可行的。
下一步是引入完整别离的数据模子:
在我看来,这是第一个契合 Greg Young 提出的原始设法的模子,如今我们称它为 CQRS 。可是它依然有问题!我以后再写。
事情溯源是与 CQRS 一同提出的一个观点,凡是被标识为 CQRS 的一部分。ES(Event Sourcing)的观点很容易:我们的范畴生成的事情表现系统中的每个更改。假如我们从系统Start记载每个事情,并且从最后形态Start重现,我们会失掉系统确当前形态。它与银行账户的事务类似;我们可以从空账户Start,重现每个独自的事务,然后(有盼望地)失掉以后的余款。因而,假如我们曾经存储了一切的事情,我们能失掉系统确当前形态。
固然 ES 是存储系统的形态的一种很好的办法,可是 CQRS 其实不必定需求它。关于 CQRS ,范畴模子实践上怎么存储其实不主要,并且这只是一个选项。
当我们浏览 CQRS 时,别离模子的观点仿佛十分明晰和间接,但在完成过程当中仿佛其实不明白。写模子的义务是甚么?我能否应当将一切数据放入我的读取模子中?嗯,这得看状况!
我爱好把我的写作模子看做是系统的中心。这是我的范畴模子,它做营业决议计划,它很主要。它做出营业决议计划的现实在这里是相当主要的,由于它定义了这个模子的首要职责:它代表系统的真实形态,可以用来做出有价值的决议计划的形态。这类形式是独一的真谛起源。
假如你想了解更多关于设计范畴模子的常识,我引荐你浏览范畴驱动设计技术哲学。
在我第一次测验考试 CQRS 时,我运用了 WRITE 模子来构建查询……它是 OK 的(或许最少是有效的)。过了一段工夫,我们抵达了项目中需求破费大量工夫实行查询的地方。为何?由于我们是顺序员,优化是我们的第二天分。我们将模子设计为标准化,因而我们的读取端遭到衔接的影响。我们自愿预先盘算一些陈述的数据以坚持疾速。这很风趣,由于实践上我们引入了缓存。在我看来,这是读取模子的最好定义:它是一个正当的缓存。因为我们必需宣布项目,而非功用性的需求没有失掉知足,因而,缓存是经过设计来完成的。
标签读取模子可以建议它存储在一个数据库中,仅此罢了。实践上读取模子可能十分庞杂,你可使用图形数据库来存储社会衔接,运用 RDBMS 来存储财政数据。这是一个多言语耐久性很天然的地方。
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务