MBAPI模型——向统一标准化的努力

MBAPI模型——向统一标准化的努力

CQRS说的是Command和Query分离。它把Action分类为两种:Command和Query。并且明确的说“不存在第三种”。

其实博客园的博主也是分作两类的:一类是男博主,一种是女博主。不存在第三种博主。将博客园的博主按照男女分类为两种的分类法比将Action分类为Command和Query好理解多了吧。

上面的分类也可以表述为:Action分两种,一种是Command,一种是“非”Command;博客园的博主分两种,一种是男博主,一种是“非”男博主。

什么是Command?什么是Query?不必追求100%正确,借助大家熟知的“方法/Method来”来形式化Command和Query的话。那么,所有我们书写过的“无返回值”的方法都是Command,所有我们书写过的“有返回值”的方法都是Query。“有无返回值”跟“是非男女”比较像了吧。比如这里书写一个void
SignIn(string loginName, string password),这个方法就属于Command,而AccountInfo
GetAccount(string loginName)则属于Query。那么要是有人书写了AccountInfo Login(string
loginNamem, string password)方法怎么办?可以将它看作是Command和Query的混合,先Command再Query。

在实现CQRS的框架中我们是如何模型化Command的呢?是这样的,比如对于上面的void SignIn(string loginName, string
password)命令方法可以模型化为下面的样子:

public class SignInAccountCommand : Command{

public
SignInAccountCommand(string loginName, string password){

this.LoginName = loginName;

this.Password = password;

}

public string LoginName{get; private set;}

public string Password{get; private set;}

}

SignInAccountCommand跟SignIn方法完全一样,都是完整的描述一件事情,并为‘做’提供完整的输入。loginName和password即是输入。SignInAccountCommand成功对象化了SignIn方法并且丝毫没有损失信息。值得说明的是:Command中的输入和Event中的输出都应是只读的不可变的”。

下面我们看看“四人帮”的Command模式是怎么说的:

Command:一个封装了用于处理客户端请求的逻辑对象。这些对象可以立即

执行,为推迟处理而进入队列、保存和记录日志。

Command Message:标识客户端需要调用的逻辑操作的消息。命令消息还为

这些操作提供输入数据。

Command完整的描述了一件事情并为做提供了完整的输入。当我们使用命令式编程语言比如C#写程序的时候就是在书写一个个的命令。比如我们的rdb中有个Function表,有个引用了Function表的ManagedFunction表,还有个引用了ManagedFunction表的RoleFunction表。当我们在数据访问层或者应用服务层使用C#书写删除Function实体的逻辑的时候是怎么做的呢?可以使用如下三个命令来表达:DeleteRoleFunctionCommand,DeleteManagedFunctionCommand和DeleteFunctionCommand。将这三个命令按照顺序执行就可以了。

public class SignInAccountCommand : Command{

public
SignInAccountCommand(string loginName, string password){

this.LoginName = loginName;

this.Password = password;

}

public string LoginName{get; private set;}

public string Password{get; private set;}

}

void SignIn(string loginName, string password)是等效的。但是为每一个命令方法都创建一个command
class看起来不太像是最佳实践。应该有更好的等效的表达命令的方式。可不可以这样?引入几个简单的概念,然后基于对这些简单概念的理解给出一个“形”。使用这个形应可以表达任何命令。现在我们可以将SignIn方法表述成这样:

ontology=”account”

verb=”signIn”

infoID=[{‘key’:’loginName’,’value’:’anycmd’}]

infoValue=[{‘key’:’loginName’,’value’:’anycmd’},{‘key’:’password’,’value’:’123456’}]

看来是可以的,因为通过以上四行我们同样完整的描述了SignIn命令并为执行提供了完整的输入。上面这种形式也并不太难理解,对比一下http的请求文档两者没有本质的区别。Ontology
+ infoID = uri,verb = httpMethod,infoValue = httpContent。

既然使用http也能描述命令为什么还要提出新的形式呢?这个不成熟的随笔上有回答。

Ontology、verb、infoID、infoValue是Command的要素,除此之外还有一些辅助元素,如下图所示:

采用上图的“形”填入承载“信息”的数据是可以描述宇宙万事万物的。

Message分三种:Action(行动)、Command(命令)、Event(事件)。三者在数据传输对象的结构上不做进一步区分,三者结构完全相同。

时间戳:三者均具有时间戳属性,不同的是“行动”的时间戳来自当前的宇宙上下文;命令的时间戳由客户端填入,但命令的具体执行时间由服务端决定;事件的时间戳往往是过去的也由客户端填入。

执行性质:服务端立即执行请求类型为Action的命令,随意执行请求类型为Command的命令(“随意”指何时执行由服务端自定,如延迟到晚上执行),如何处理请求类型为Event的命令也由服务端自主决定(面向EventSourceType、EventSubjectCode和StateCode编程)。

服务器只有一个收发这三种Message的服务就可以了:

Message可以完整的描述任何一件事情并为做提供完整的输入,服务的inputModel和outputModel类型都是Message的话就功能完备了。

MBAPI模型——向统一标准化的努力,布布扣,bubuko.com

时间: 2024-08-05 16:58:25

MBAPI模型——向统一标准化的努力的相关文章

Web Api 返回参数,实现统一标准化!

string camelCaseObj = JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, ContractResolver = new CamelCa

asp.net core 2.1的全局模型验证统一方案

网上的统一模型验证,有效到asp.net core 2.0 2.1的mvc还可以用 webapi嘛,想想就好,自己琢磨了一顿,才发现这东西应该这样玩 首先吧api上面的特性注释了 //[ApiController] 这个会干扰 然后把ControllerBase改为Controller 这样,你写的模型验证的统一过滤器才生效,缺一不可 如果不信,大可测试一下 原文地址:https://www.cnblogs.com/NCoreCoder/p/10114041.html

django模型系统一

一.复习 代码布局(代码放在哪里) app目录下:必需放在app目录下 templatetags文件夹,不能写错一个字符 app必需注册 1.自定义过滤器 为什么(案例:男:1,女:0...怎么展示) 定义:过滤器就是一个函数. --有1到2个参数 --第一个参数传进来的是模板变量.(过滤器必需依赖模板变量) --第二个参数其他的参数 --return你想要显示的数据 注册过滤器: from django.template import Library register=Library() 这个

转:数据标准化/归一化normalization

转自:数据标准化/归一化normalization 这里主要讲连续型特征归一化的常用方法.离散参考[数据预处理:独热编码(One-Hot Encoding)]. 基础知识参考: [均值.方差与协方差矩阵] [矩阵论:向量范数和矩阵范数] 数据的标准化(normalization)和归一化 数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间.在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较

字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系

Linux驱动开发的童鞋们来膜拜吧:-)  学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关联的分析.对于开发者而言,能够熟悉某一点并分享出来已很难得,但对于专注传授技术和经验给

[kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关

归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)

博主学习的源头,感谢!https://www.jianshu.com/p/95a8f035c86c 归一化 (Normalization).标准化 (Standardization)和中心化/零均值化 (Zero-centered)归一化:1)把数据变成(0,1)或者(1,1)之间的小数.标准化:使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均).标准差变为1中心化:平均值为0,对标准差无要求归一化和标准化的区别:归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1

第1部分: 游戏引擎介绍, 渲染和构造3D世界

原文作者:Jake Simpson译者: 向海Email:[email protected] ------------------------------------------------------------第1部分: 游戏引擎介绍, 渲染和构造3D世界 介绍 自Doom游戏时代以来我们已经走了很远. DOOM不只是一款伟大的游戏,它同时也开创了一种新的游戏编程模式: 游戏 "引擎". 这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和

游戏引擎剖析

原文作者:Jake Simpson 译者: 向海 Email:[email protected] 第1部分: 游戏引擎介绍, 渲染和构造3D世界 介绍 自Doom游戏时代以来我们已经走了很远. DOOM不只是一款伟大的游戏,它同时也开创了一种新的游戏编程模式: 游戏 "引擎". 这种模块化,可伸缩和扩展的设计观念可以让游戏玩家和程序设计者深入到游戏核心,用新的模型,场景和声音创造新的游戏, 或向已有的游戏素材中添加新的东西.大量的新游戏根据已经存在的游戏引擎开发出来,而大多数都以ID公