当前位置:澳门新葡亰网站所有平台 > www.7415.com > API暴露CQRS系统功能

API暴露CQRS系统功能

文章作者:www.7415.com 上传时间:2019-11-26
资源

大家很当然地想到应该有二个InventoryItem财富,因而大家将世界中的那些单根实体暴光为多个独门的财富,可以用/api/InventoryItem便利地拓宽表示。每一个仓库储存货品将用/api/InventoryItem/{id}进展表示,m-r使用了大局唯黄金时代标记符(GUID卡塔 尔(阿拉伯语:قطر‎作为Id。

利用那几个独自的根对象就足以完整的显现大家的世界了。还应该有风姿罗曼蒂克种方法是应用/api/InventoryItem/{id}/Stock其一能源作为丰硕和删除仓库储存量(即签入或移除货品卡塔尔的方式。从本质上说它们并未有怎么高下之分,无非是哪类方法可以更加好地显现能源而已。由于第风度翩翩种艺术进一层便捷,由此大家就采纳这种艺术。

(单击图片以推广卡塔 尔(阿拉伯语:قطر‎

www.7415.com 1

创制生机勃勃套上层的REST API

借使您协助于先去体会一下最终的达成,能够在那处看一下二个脚下(权且性卡塔 尔(英语:State of Qatar)可运转的原型。大家鼓劲你利用fiddler只怕浏览器自带的开拓工具去检查一下那几个轻松的示范中的HTTP诉求。在GitHub上得以找到包罗那套API和一个主导的Angular应用的源代码。但是大家依旧要重申,它的落到实处情势和选用的技巧并非关键所在,读者更应当关爱于统筹方式及HTTP的变现。

除此以外大家还提供了豆蔻梢头套原型API,它确立于GregYoung编写的m-r CQ宝马X5S原型之上,后面一个也被誉为SimplestPossibleThing。m-r能够感到是CQCRUISERS原型的事实规范,它激情了多数团伙接纳并成立CQLANDS系统。固然那一个m-r原型很简短,但它曾经能够显得在切切实实世界中采纳RESTful CQ陆风X8S系统的有个别机缘和挑衅了。

CreateInventoryItemCommand

从CRUD范式的角度来讲,CreateInventoryItemCommand很当然地适用于POST方法。(这里只显示首要的头新闻卡塔 尔(阿拉伯语:قطر‎

POST /api/InventoryItem HTTP/1.1 
Content-Type:application/json;domain-model=CreateInventoryItemCommand  

{"name": "CQRS Book"}

回去的响应如下:

HTTP/1.1 202 Accepted 
Location: http://localhost/SimpleCQRS.Api/api/InventoryItem/
109712b9-c3d5-4948-9947-b07382f9c8d9

该操作将在location头新闻中回到那些将被成立的库存货物(因为具有操作都以异步施行的卡塔尔的UXC60L地址。

CheckInItemsToInventoryCommand和RemoveItemsFromInventoryCommand

那多少个指令就越发有趣了。我们将往仓库储存中投入或删除一些物料。从某地点来讲,这种操作是对仓库储存物品的数额实行翻新,因而得以将其贯彻为贰个PUT(只怕PATCH更适用卡塔尔国方法。但因为那多个指令并不是幂等(例如说,调用CheckInItemsToInventoryCommand一遍应该加上两遍仓库储存卡塔尔,由此最相符的谓词实际上是POST。

顾客端就要Content-Type头消息中的参数中设置领域模型的名称,就像大家事先所见的相似。

POST /api/InventoryItem/f2b75f21-001a-4eed-b8f3-35bf5e4e9b0d HTTP/1.1 
Content-Type:application/json;domain-model=CheckInItemsToInventoryCommand  

{"count": "230"}

回来的响应是同样的:

HTTP/1.1 202 Accepted

一声令下和询问权利分开(CQ奥迪Q5S卡塔 尔(英语:State of Qatar)是由GregYoung建议的风流倜傥种将系统的读(查询卡塔尔、写(命令卡塔尔操作分离为二种独立子系统的架构方式。命令日常是异步实践的,并蕴藏在叁个事务型数据库中,而读操作则日常是终极风流倜傥致的,并且数据出自于解正规化的视图。

查询

作者们需求四个查询:GetInventoryItemsGetInventoryItemDetails。这里大家将经过八个GET方法/api/InventoryItem/api/InventoryItem/{id}暴表露那多个查询作用。

GetInventoryItems主意能够拿走仅富含了货品名称Id的多个列表,它会基于ACCEPT头决定回来JSON或是XML(ASP.NET Web API能够帮忙那风流倜傥效应卡塔尔国。借使有些能源切合于缓存,那么富有的GET需要都有非常的大可能率回到缓存数据。GetInventoryItems返回InventoryItemListDataCollection用作出口语资源消息息。就算能够通过数量内容的哈希生成ETag,可是这里我们选拔将列表中每生机勃勃项的Id名称扩充哈希后收获的结果作为ETag重回给客商端(举个例子浏览器卡塔 尔(英语:State of Qatar)。客户端可以采用将能源缓存起来,并针对ETag使用If-Non-Match进行标准央浼。大家筛选将财富的max-age设为0,因而顾客端的GET会始终使用准则诉求,可是也得以选拔安装壹位造的过期时间。

GET /api/InventoryItem HTTP/1.1 
Accept:application/json, text/plain, */* 
Accept-Encoding:gzip,deflate,sdch 
If-None-Match:"LdHipfxR7BsfBI3hwqt2BLsno8ic98KmrIA1y67Nnw4="

回来结果

HTTP/1.1 304 Not Modified 
ETag: "LdHipfxR7BsfBI3hwqt2BLsno8ic98KmrIA1y67Nnw4="

GetInventoryItemDetails方法会再次回到有些仓库储存货色的内情,饱含IdNameCurrentCount天性,最后风流浪漫项属性记录了近日的仓库储存数据。就算其间领域的读取模型(read model卡塔尔国包涵了版本号,但假诺将有些数值类型的版本号直接作为ETag会时有产生安全性难点,因为客户端能够轻松地猜出下二个数值。由此,我们选择了选拔高端加密标准(AES卡塔尔国对版本号进行加密后,作为InventoryItemDetails方法的ETag输出。

为每一个操作都再一次达成ETag对于API层来说有一些负责过重,因而大家定义了三个IConcurrencyAware接口:

public interface IConcurrencyAware 
{ 
    string ConcurrencyVersion { get; set; } 
}

每种扶持ETag的出口模型都要贯彻那个接口,当API层看见有些输出模型支撑这几个接口时,就会读取版本号并安装ETag值。其他方面,当API层对条件式GET乞求举办响适合时宜,会将调换的ETag与客商端在If-None-Match头中传入的值进行相比较。全体这一个操作都足以通过四个独立的大局filter完结:ConcurrencyAwareFilter

亟需留意的是,增多、删除恐怕重命名某些仓库储存货色时应该使物品列表的缓存失效。请看上边包车型大巴例子(条件式GET乞求的逻辑是在浏览器端完结的,无需专门编写代码完毕卡塔 尔(阿拉伯语:قطر‎:

GET /api/InventoryItem HTTP/1.1 
If-None-Match:"CWtdfNImBWZDyaPj4UjiQr/OrCDIpmjVhwp8Zjy+Ok0="

回到结果是八个状态码为200的完好响应,而且包蕴了三个新的ETag值:

HTTP/1.1 200 OK 
Cache-Control:max-age=0, private 
Content-Length:68 
ETag:"0O/961NRFDiIwvl66T1057MG4jjLaxDBZaZHD9EGeks=" 
Content-Type:application/json; charset=utf-8; domain-
model=InventoryItemListDataCollection; version=1.0.0.0; 
format=application%2fjson; schema=application%2fjson; is-text=true 
...

请小心Content-Type头包括了附加的参数,那是对于“媒体类型的各类等级”(大概简单称谓5LMT卡塔尔国概念的风流浪漫种实现,这种艺术不是将具有新闻都塞到贰个独门的令牌(token卡塔 尔(阿拉伯语:قطر‎中,而是利用差别的参数来表明对客户有用的两样级其他多少,能够抒发不相同级其他有用音讯。下文种对这么些宗旨做越来越的研究。

有关小编

www.7415.com 2Ali Kheyrollahi 是一人解决方案架构师、小编、博主、开源软件的小编和贡献者,方今供职于London的一家大型电子商务集团。他对HTTP、Web API、REST、DDD和概念模型抱有宏大的热心肠。而在管理实际的作业难点上又持有始有终实用性。他在这里生龙活虎行原来就有12年以上的资历,并在多个杰出公司专业过。他对此计算机视觉和机械和工具学习世界具有狠抓的兴趣,並且已经公布了多篇故事集。在从前,他曾是一名医务职员,并作为一名非专科医师工作了5年。可以在这里边找到他的博客,别的她在twitter上也十二分活跃,能够经过@aliostad关怀他。

翻看原来的文章地址:Exposing CQRS Through a RESTful API

可选的产出检查

在m-r最早的落到实处中,全数命令(除了CreateInventoryItemCommand,它已经隐式地富含了值为0的版本号卡塔尔都包涵二个卡尺头型的CurrentVersion字段。而这一个版本准将它们改善为可选的(即C#中的可空类型卡塔尔。

在乎气风发边,服务端应该肩负确定保证本人情形的完整性。因而它不可能、也不应有凭借于顾客端所提供的版本号。并发检查是当做五个风味提须要顾客端的,并不是服务端用以保险模型完整性的机制。假如客商端关怀并发行为,那它就能够选择性地发送版本号,那已经经过在ETag中的加密消息提供给它们了。要切记的是,并发检查与服务端的平地风波版本号是分裂的概念,前者是服务端的内部得以实现机制。

生机勃勃边,对于有些操作来讲,并发检查是平素不意义的。举个例子来讲,要是三个客商端在同时(调用CheckInItemsToInventoryCommand方式卡塔 尔(英语:State of Qatar)增加了十几个仓库储存物品,况且它们都装有版本号n,那么内部有一个发令就能够停业,但这种战败是不供给的,因为大家真的需求充裕叁十五个货物。这种难点在高访谈量的情形下会被加大。想象一下,要是大气的客户涌入亚马逊(Amazon卡塔 尔(阿拉伯语:قطر‎网址去进货哈利Porter的风靡生龙活虎期,在繁多状态下他们都会遇上并发难题。

在HTTP中推行PUT(和PATCH卡塔 尔(阿拉伯语:قطر‎操作时会认为现身是多个可选的检查,那或多或少绝不偶尔。固然现身检查能够异步试行,但大家必要着力确定保证它必得同步实施,由此当我们再次来到状态码202(已采纳卡塔 尔(英语:State of Qatar)时,就象制服务端已经确认了从未现身冲突境况的发出。

www.7415.com,青天白日领域的协会

对此这一个API层来讲,最要紧的权利是将底层的领域建立模型为资源,并透过HTTP语义暴暴露来。在此个历程中,API层将创制一个国有领域,它由财富(以致它们的唯大器晚成标志符->U安德拉L卡塔 尔(阿拉伯语:قطر‎以至输入和输出的消息所构成。底层的天地越轻便,那个公开领域和底部领域的近似程度就越高。

(单击图片以松手卡塔 尔(阿拉伯语:قطر‎

www.7415.com 3

在这里个例子中,大家创造的公然领域与底层的领域照旧比较平常的,但即使是这种简易的园地,我们也不可能间接将底层的圈子暴揭露来:这或许诱致领域的里边落实被泄表露来,何况世界里面也不肯定带有API层所需的满贯性质。比如说,全数的此中命令都会用一个整数来表示并发时所需的版本号,而在公开领域中则用字符串代表这么些性情。大家稍后将会利用那么些天性作为ETag,而据说HTTP规格供给,ETag必须是不透明的。

归纳来讲,咱们所创制的当众领域表现了此中的园地类,但又不完全相像。这种公然领域常常被叫做四个视图模型(Vide Model卡塔 尔(英语:State of Qatar)。这几个术语并不太标准,因为这种表明情势感到上对公开领域有个别排外,将它正是大器晚成种“哑”模型,由此大家协理于选取一个新术语“输出模型”(output model卡塔 尔(英语:State of Qatar)。它将被利用到输入和出口语资源音讯息中(命令和出口模型卡塔尔国。

结论

岂但经过朝气蓬勃套REST API揭露CQENCORES是恐怕的,并且HTTP语义的丰盛性也使得大家能够在它的根底上编写制定意气风发套通畅而有效的API。整个流程满含创立叁个由命令和询问(输入输出音讯卡塔 尔(阿拉伯语:قطر‎组成的通晓领域,以致能够管理并发和缓存的各样财富。其他,咱们还亟需将在那之中领域的查询和下令映射为HTTP谓词,何况采取情状码以表现意况转变和特别。使用5LMT将推向创立完全RESTful,并不是长间距进程调用风格的财富。全部这个都能够通过一个比异常的小但能够运营的原型应用举举办展览现,该原型是经过ASP.NET Web API和AngularJS达成的。

媒体类型的多样品级(5LMT卡塔 尔(阿拉伯语:قطر‎和创建新的传播媒介类型

在社区里布满的生机勃勃种做法是成立新的传播媒介类型,常常可以称作制作新的媒体类型。比方来讲:

Content-Type:application/vnd.InventoryItemListDataCollection.1.0.0.0+json;

这种应用异乎平日的措施意味着有个别媒体类型的子类型已经变为了风流倜傥种通用的举行(已经实际产生后生可畏种约定了),它将子系统一分配解为局地特定的、可能是规范的成分,并由此+号连接在一块。已经有一些经过登记的媒体类型应用了这种约定,举例application/rss+xmlapplication/atom+xml。那多少个示范处于媒体类型等第中的第3品级(恐怕叫做schema品级卡塔 尔(英语:State of Qatar),而application/xml则处于第2等第(format等第卡塔 尔(英语:State of Qatar)。某种意义上说,application/atom+xml就是大器晚成种application/xml品类,它们选拔同大器晚成的format,而后边一个还指明了会选取ATOM schema。

尽管那意气风发约定会在将来版本的HTTP规格中获得确定,但它未有减轻媒体类型不断增高的主题素材。首先,使用此外未注册的媒体类型都是HTTP规格所不提倡的,使用上述品种的Content-Type值也是平等。实际上,即使大家须要在具备API中为七个例韩国媒体体级其他大肆组合都注册生机勃勃种媒体类型,那互连网号码分配局(IANA卡塔 尔(阿拉伯语:قطر‎恐怕需求动员一大批判人去专门从事那个局面宏大的任务了。其他方面,大多顾客端系统使用基于dictionary的传播媒介类型去管理这种央求,它们将不可能应付新创制的媒体类型。

由此接受5LMT能够允许现成的顾客端继续遵循事先的办法健康办事,而更先进的客商端则足以选取更加高等别的新闻,它们都以用作独立的实体提供的。

因此二个当众的圈子保险内部领域是关键所在

将服务端的中间落到实处实行抽象对客户端的话是老大重大的。好似以前所述,为极小的小圈子所创设的当众领域和在那之中领域会相比相符,但即便是在m-r这么些示例中,大家也不可以见到将里面领域直接暴表露来,而必须成立叁个单独的模子,它显现了顾客端能够选取和相互的消息

大家还应该将公开领域文书档案化,并显现给客商端。那生机勃勃边的进展值得关怀,因为已经有各样不一致的方式和施行开首表露水面了(从WADL到Swagger、RAML和RestDown等等卡塔尔。

大家在将下有个别审阅m-r的圈子模型,随后对相关个性的API设计进行一些探究。最终,大家将对某些所做的筛选张开研讨,并且商量一些RESTful m-r的概念和申辩内容。

m-r领域

m-r模型是一个透过简化的仓库储存管理种类的天地模型,你能够创建新仓库储存货色(假若它是某种类型的成品卡塔 尔(英语:State of Qatar),重命名或撤除激活(即逻辑删除卡塔 尔(英语:State of Qatar)它们。被废除激活的物品将不再为客户所见,而颇有活动的物料都可以被获取,並且能够看见各类物品的持有细节。你也能够扩大或减少那么些库存货物,内定所参加或减弱的物料数量。换句话说,在成立仓库储存量之后,就能够起来采纳那些连串了。

客户将经过同步的询问来查阅货物列表或是物品细节,对于货色意况的退换将因此命令来贯彻。在切实世界中,命令应该是异步试行的,但由于代码中应用了内部存款和储蓄器中的风浪总线(伊芙nt Bus卡塔 尔(英语:State of Qatar)及事件管理函数,由此在最终促成中命令都以同台推行的。

www.7415.com 4

m-r模型实现了CQ大切诺基S:命令和询问被分级存款和储蓄在不相同的地点,况且各自由系统中完全分裂的局地开展管理。

除此之外CQ奇骏S之外,m-r也运用了事件本源(Event Sourcing卡塔尔作为它的漫长化学工业机械制。在此种办法中,对于世界模型的改革会被抓获为生机勃勃层层的风云,那个事件会依据它们被调用的顺序存款和储蓄起来。为了获取某些模型的当下意况,需求将具有事件遵照它们发出的顺序进行回看。换句话说,模型中实体的图景消息是不会被长久化的。例如来讲,借使大家创立了一个仓库储存物品,随后将它重命名一遍,那么大家将会收获三个InventoryItemCreated事件和三个InventoryItemRenamed事件,这个事件都会被封存在事件存款和储蓄(Event Store卡塔 尔(英语:State of Qatar)中。

事件是连续的,而且各种事件都含有三个本子号,用以在并发时举办检查。比释迦牟尼佛讲,假如有个别仓库储存货品在本子2的底工上进展重命名,但赶巧有另多个重命名发生在同二个货品上,并使它的当前版本变为3,那么这种境况就能引致现身分外。

指令与天地事件常见是生龙活虎对风度翩翩的关系,当调用了某些命令之后,领域模型会发起并蕴藏二个平地风波。领域事件是事件本源的根本,它和跨八个边界上下文(bounded context卡塔 尔(阿拉伯语:قطر‎的风云差异,往往粒度更加细,而且只满含所需的微小数量的音信。因而,它并非贰个切合于在差别的边界上下文之间展开集成的工具。除了采用八个经过内的事件总线之外,m-r还用到了三个内部存储器中的风浪存款和储蓄。这几个蕴藏本质就是三个哈希表,它应用模型的id作为键,并且不仅仅追踪模型中产生的别样事件。

如欲理解CQ帕杰罗S和事件本源的越来越多新闻,你可以阅读GregYoung的那本迷你书。

本文在那提出并为读者展现风华正茂种为CQ讴歌RDXS系统创设生机勃勃套RESTful API的章程。这种办法结合了HTTP的语义、REST API基于财富的风格,并能够管理布满式总计的一点难题,比方最后黄金年代致性和并发性。

HTTP的任哪儿方

兑现HTTP的有个别别样方面也会推动一些受益,HEAD也是一个首要的谓词,它的响应结果和GET方法相似,但再次来到的响应体中不包罗此外内容。大家为具有GET财富都得以实现了HEAD谓词,举个例子:

HEAD /api/InventoryItem HTTP/1.1 
Accept:application/json, text/plain, */* 
Accept-Encoding:gzip,deflate,sdch

将返回

HTTP/1.1 200 OK 

ETag: "LdHipfxR7BsfBI3hwqt2BLsno8ic98KmrIA1y67Nnw4="

现实在促成中会将HEAD必要转向给GET方法的处理函数,而框架自个儿会在结尾负担移除重临的内容。那黄金时代类别达成都以自行触发的,因而在响应中得以精确地收获ETag。

另一个急需得以实现的要害谓词是OPTIONS,这一个谓词能够用于生成API文书档案,可是大家那边只是简短的回到该财富扶持的具有谓词:

OPTIONS /api/InventoryItem/f2b75f21-001a-4eed-b8f3-35bf5e4e9b0d HTTP/1.1

它将回来如下内容:

HTTP/1.1 200 OK 
Allow: GET,POST,OPTIONS,HEAD,DELETE,PUT 
Content-Length: 46 
Content-Type: application/json; charset=utf-8; domain-model=String%5b%5d; version=4.0.0.0; 
format=application%2fjson; schema=application%2fjson; is-text=true  

["GET","POST","OPTIONS","HEAD","DELETE","PUT"]

请留意,响应中的Allow头对于OPTIONS供给来讲是必需的。然则HTTP规格本人并不曾点名OPTIONS响应体中现实写法,由此我们就将允许的谓词作者为多个字符串数组重回(注意,在domain-model参数中的String[]是经过UrlEncoded艺术编码的结果卡塔 尔(阿拉伯语:قطر‎。能够采用那几个谓词生成适合各类schema和语言须求的API文书档案。

除外这一个方式之外的此外调用都会重返叁个方法未找到(method not found卡塔 尔(英语:State of Qatar)可能405状态码,ASP.NET Web API本人已经落到实处了这一意义:

PUT /api/InventoryItem HTTP/1.1  

{}

它将重返:

HTTP/1.1 405 Method Not Allowed 
Allow: POST,GET,HEAD,OPTIONS  

{"message":"Http Method not supported"}

讨论

那风流倜傥部分将详细描述有些理论概念,以至大家的决定中部分相比较困难,或许恐怕引起争论的某个。

DeactivateInventoryItemCommand

好似前文所述,撤消激活仓库储存货色就意味着贰回逻辑删除。别的,删除操作是幂等的,因为一再剔除贰个库存货物的作用和一回删除是相近的。因而我们将应用DELETE选项作为裁撤激活有个别物品的秘籍(该方式包涵四个空的方法体卡塔尔。

DELETE /api/InventoryItem/f2b75f21-001a-4eed-b8f3-35bf5e4e9b0d HTTP/1.1 
Content-Type:application/json;domain-model=DeactivateInventoryItemCommand  

{}

归来的响应如下:

HTTP/1.1 202 Accepted

固然也得以在方法体中传递id,但在U凯雷德L中已经提供了id新闻。DeactivateInventoryItemCommand构造函数的并世无两职务是对的地安装domain-model这些参数。

命令

查询普通会映射到GET方法,而下令则须求映射到POST、PUT、DELETE和PATCH方法。将HTTP谓词映射到CRUD操作是生龙活虎种流行的历史观,但在实际世界中少之甚少能够将谓词和数据库操作后生可畏意气风发对应。实际上,REST API并不在对悠久化存款和储蓄之上的三个简短包装,相反,它是指援客户去探听事情领域、操作与专门的学问流的大器晚成扇门。由此它必得能够不依靠于于特定的谓词去抒发有些维度的准备。

风姿洒脱种广泛的措施是利用远程进度调用(RPC卡塔 尔(英语:State of Qatar)风格的能源,举个例子/api/InventoryItem/{id}/rename。固然它看起来确实去除了对某种谓词的依附,但它违反了REST面向能源的变现手艺。大家需求牢牢记住,能源是叁个名词,HTTP谓词则意味动词和动作,而自描述的消息(REST的主题之意气风发卡塔尔国则是公布其它维度音讯和图谋的花招。实际上,在HTTP音讯中所包罗的授命就活该能够描述任哪个人为的操作了。可是,完全凭仗于诉求体中的信息也会有它和煦的主题素材,因为央浼体常常是当作流传递的,要在辩认出它的具体操作以前得到整个要求体临时是不恐怕形成的,并且那亦非大器晚成种明智的做法。这里,大家将呈现风度翩翩种基于5LMT中的第4级别(即世界模型卡塔 尔(阿拉伯语:قطر‎管理诉求的不二秘诀,命令的品类将富含在Content-Type头中的有个别参数内。

PUT /api/InventoryItem/4454c398-2fbb-4215-b986-fb7b54b62ac5 HTTP/1.1  
Accept:application/json, text/plain, */* 
Accept-Encoding:gzip,deflate,sdch 
Content-Type:application/json;domain-model=RenameInventoryItemCommand

如此那般就可以预知将央浼正确地输送给服务端相应的拍卖办法了。那这种办法是还是不是将过多的新闻走漏给客商端了吧?其实不然。输入输出音信的schema(以至名称卡塔尔国是当面领域的风流倜傥部分,顾客端必需能够全体地探问到它,由此它们依附于schema也是在大家所预期的。

有关顾客端的贯彻只用了起码许的代码,这里运用了一个AngularJS*的装饰(decorator)封装了$http服务,它亦可读取那几个原型的回到内容,並且能够在Content-Type头中参与额外的参数音讯。只要保持JavaScript构造函数*的名称不改变就没极度。

笔者们早就缓和了辨识当前正被调用的方式的主题素材,接下去要求将下令遵照语义映射到对应的HTTP谓词。在将指令映射到谓词时,选用精确谓词的机要不仅在于语义,同样要考虑幂等性(至于谓词的安全性则无需忧虑,因为其余三个命令谓词都是不安全的卡塔尔。PUT、PATCH和DELETE是幂等的,而POST则不是幂等的(多次调用七个幂等的谓词的结果与仅调用叁回是雷同的卡塔 尔(阿拉伯语:قطر‎。

RenameInventoryItemCommand

RenameInventoryItemCommand比起任何命令来讲更加有意思一点。首先,重命名贰个仓库储存货色也正是开展矫正,由此使用PUT谓词是最合适的。其他方面,若是您正在重命名有些货物时,你的同事也在尝试将其重命名称叫另一个名字的话会怎么样呢?那便是一个面世难题。HTTP通过If-Unmodified-SinceIf-Match提供了对财富拓展并发修正时的维护体制。因为大家使用了ETag,因而就相应地设置If-Match

PUT /api/InventoryItem/f2b75f21-001a-4eed-b8f3-35bf5e4e9b0d HTTP/1.1 
Content-Type:application/json;domain-model=RenameInventoryItemCommand 
If-Match:"DL1IsUoH709K+N5TXFzlQeQI5arO8r/U0SzXcRhuXLc="  

{"newName": "CQRS Book 1"}

AngularJs的controller会传递ETag值,并传到模型中,之后在标准化式PUT乞请时展开应用。如你所见,ETag的值仅仅是对世界模型中版本号的豆蔻年华种展现,但大家对其开展加密以满足HTTP规格的需求。服务端获取到这些值之后进展解密并回复成版本号的数值。假使版本号不宽容,领域模型就能够抛出叁个ConcurrencyException异常,在API层的ConcurrencyExceptionFilterAttribute类捕获到那几个这几个之后,会以HTTP语义的艺术表现该特别。

HTTP/1.1 412 Precondition Failed

本条例子很好地表达了HTTP的面世如何与CQWranglerS的面世检查体制相结合。

本文由澳门新葡亰网站所有平台发布于www.7415.com,转载请注明出处:API暴露CQRS系统功能

关键词: