原帖地址:http://www.cnblogs.com/happyframework/archive/2013/05/27/3100923.html
背景
企业需要“快速的”和“高质量的”交付应用,采用传统的三层架构+数据驱动开发可以带来快速交付,但是高质量视乎无从保证,这篇文章我谈谈我准备如何应对这种需求。
思路
CQRS + DDD + MDP(元数据驱动编程)
看图解说
从读和写的角度思考一些问题。
- UI层的编码量占据了整体的50%-80%(我自己的经验)之间。
- UI层的主要目的是展示,即读取。
- UI层团队的开发人数比例不符合他们的编码量(企业应该加大对UI层人才的投资和引进)。
- UI层团队的编码水平相对较差(我自己的经验,我见过好的UI人员,月薪2W)。
- UI层在代码级别相对容易抽象和重用(企业应用)。
- UI是用户关注的重点。
- 写操作是实现读取的前提,(数据不写进去,无从读取)。
- 写操作是驱动业务流程的核心所在(业务模型的核心)。
- 写操作在代码级别不容易重用,在概念级别更加容易重用。
鉴于上边的9条现状,我决定采用如下开发模式。
- 整体系统采用CQRS架构。
- 使用MDP开发Q(读取),保证快速。
- 使用DDD开发C(写端),保证高质量。
简单的示例
效果图
Grid.js
1 Ext.define('Demo.user.view.Grid', {
2 extend: 'Happy.grid.Panel',
3 alias: 'widget.user_grid',
4 requires: [
5 'Demo.user.metadata.Manager',
6 'Demo.user.view.Form',
7 'Happy.grid.action.Refresh',
8 'Happy.grid.action.Edit'
9 ],
10
11 title: 'user grid',
12
13 initComponent: function () {
14 var me = this;
15
16 me.initTbar();
17
18 me.callParent(arguments);
19 },
20
21 initTbar: function () {
22 var me = this;
23
24 me.tbar = [
25 Ext.create('Happy.grid.action.Refresh'),
26 Ext.create('Happy.grid.action.Edit', {
27 formContainer: function () {
28 return Ext.widget('window', {
29 title: 'user form',
30 items: {
31 xtype: 'user_form'
32 }
33 });
34 }
35 })
36 ];
37 },
38
39 getMetadataManager: function () {
40 var me = this;
41
42 return Demo.user.metadata.Manager;
43 }
44 });
Form.js
1 Ext.define('Demo.user.view.Form', {
2 extend: 'Happy.form.Panel',
3 alias: 'widget.user_form',
4 requires: [
5 'Demo.user.metadata.Manager',
6 'Happy.form.action.Close',
7 'Happy.form.action.Save'
8 ],
9
10 width: 500,
11
12 initComponent: function () {
13 var me = this;
14
15 me.initButtons();
16
17 me.callParent(arguments);
18 },
19
20 initButtons: function () {
21 var me = this;
22
23 me.buttons = [
24 Ext.create('Happy.form.action.Save'),
25 Ext.create('Happy.form.action.Close')
26 ];
27 },
28
29 getMetadataManager: function () {
30 var me = this;
31
32 return Demo.user.metadata.Manager;
33 }
34 });
备注
我相信企业应用中UI层的编程可以趋于声明式,声明式本身就是一种元编程模式。不过有一点是需要注意的,本文说的这些概念,不足以真正实现快速的和高质量的产品开发,因为实现这个目的还依赖很多相关因素,如:团队、文化和组织。
相关文章:元数据驱动界面,支持三级配置(生成期、运行期和开发期)。
本文链接
分享到:
相关推荐
《JdonFramework实战:CQRS+ES在JdonFrameworkTest中的应用》 JdonFramework,由知名软件架构师钟道宏先生创立,是一款基于Domain-Driven Design(领域驱动设计,简称DDD)理念的轻量级Java框架。它以其简单易用、...
CQRS +事件源+ DDD 此应用程序是一个测试,一个研究案例。 它基于Gregory Young CQRS Simple( )。 这是什么? 这是一个基于express.js的API,旨在将生成的事件存储在本地内存事件存储中。 也就是说,重新启动...
Xer.Cqrs是一个便捷程序包,其中包含构建具有DDD概念的CQRS写面所需的所有程序包。 它将其他轻量级XerProjects库分组在一起: -包含域驱动设计(DDD)组件/概念。 -包含用于处理命令的组件。 -包含用于处理事件...
带有Entity Framework Core的ASP.NET Core参考应用程序样板,演示了具有DDD最佳实践的分层应用程序体系结构。 实现NLayer六边形体系结构(核心,应用程序,基础结构和表示层)和域驱动设计(实体,存储库,域/应用...
这是一个非常简单的示例应用程序,具有两个端点,在该应用程序中,将模拟创建具有name属性的项目以及所有已注册项目的列表。 内置: 码头工人 PHP 7.3 Zend表现力 口才ORM Swagger-PHP 入门 使用composer启动您...
遵循域驱动设计(DDD)和命令查询责任隔离(CQRS)原则的Java应用程序的实现示例,以使代码尽可能简单。 看看,玩,玩得开心! :rocket: 环境设定 安装Java: brew cask install java 克隆此存储库: git clone ...
1. **额外复杂性**:CQRS增加了系统的复杂性,需要维护两个独立的数据模型,以及可能的事件处理和同步机制。 2. **数据一致性**:由于读模型和写模型是分离的,需要确保在两者之间的一致性,这可能需要引入最终一致...
波场tron-ddd-cqrs项目是将这两种模式应用于Java平台上的一个实验性项目,旨在展示如何结合Spring AOP和AspectJ来实现DDD和CQRS。 首先,领域驱动设计(DDD)是一种强调业务领域的软件开发方法论。它的核心理念是将...
事件存储在CQRS+DDD中扮演着关键角色,因为它为系统提供了重构和回溯的可能性。 总的来说,"DDDSample-CQRS"示例展示了如何在实践中融合DDD和CQRS,利用Nhibernate进行数据持久化,构建出一个高度解耦、易于维护和...
我们将通过在一个简单的CQRS应用程序中将命令和查询分开来做到这一点。 每个模块代表引入此模式的不同方式。 而且,每个模块都是独立的应用程序。先决条件您需要什么来运行该软件: Java 8+总览示例应用程序基于...
CQRS,全称为Command Query Responsibility Segregation(命令查询责任分离),是一种软件设计模式,它将一个应用程序的读写操作分离,形成两个独立的操作域:一个是处理命令(写操作),另一个是处理查询(读操作)...
:elephant: :direct_hit: 六边形架构,PHP中的DDD和CQRS 使用域驱动设计(DDD)和命令查询责任隔离(CQRS)原理的PHP应用程序示例,使代码尽可能简单。 看看,玩,玩得开心。 ·· :rocket: 环境设定 :spouting_...
CQRS和DDD架构模式抽象的这项工作提出了CQRS(命令和查询责任隔离)和DDD(域驱动设计)体系结构模式的实际应用,其中包括: 领域模型和有界上下文定义技术代码和业务逻辑之间的清晰分离指令端休息API 查询侧边api ...
**CQRS(命令查询职责分离)**是一种设计模式,它将应用程序的读取和写入操作分开,以提高系统的性能和可维护性。在传统的单一数据模型中,读取和写入操作通常共享同一个数据库,这可能导致复杂性和性能瓶颈。CQRS...
Haskell的CQRS介绍这是CQRS + ES架构模式的Haskell实现。 它结合了两种模式,每种模式本身都具有强大的功能,但是它们的组合却成倍地强大。 第一种模式是命令查询责任隔离(CQRS),它用于将应用程序中进行写或更新...
使用Nest.js演示CQRS模式和事件驱动编程 描述此存储库的文章:该软件的框图为: 安装 $ npm install 运行应用 # development $ npm run start # watch mode $ npm run start:dev # production mode $ npm run start...
CQRS(Command Query Responsibility Segregation,命令查询责任分离)是一种设计模式,主要用于复杂的系统架构,它将一个应用程序的读取和写入操作分离,形成两个独立的模型,即命令处理部分和查询处理部分。...
用于创建应用程序的基础结构。 安装 使用简单,运行: composer require gpslab/cqrs 命令 处理程序 定位器和订户 ( ) (Symfony 3.3了 ) 序列化命令 简单用法命令 方法中的命令旨在更改应用程序中的数据。 ...
该软件包提供了用于构建CQRS-ES应用程序的构建块。 它的灵感来自Lokad.CQRS,但并不局限于特定的存储实现或基础架构。 它支持ES6类和依赖项注入,因此可以修改或替换您自己的实现中的任何组件,而不会破坏软件包的...
管理系统是一种通过计算机技术实现的用于组织、监控和控制各种活动的软件系统。这些系统通常被设计用来提高效率、减少错误、加强安全性,同时提供数据和信息支持。以下是一些常见类型的管理系统: 学校管理系统: ...