原文 http://www.jdon.com/jivejdon/thread/37712/15
Bang
按照你的逻辑,是不是我可以理解成,系统启动时,载入messageCount和第一次调用这个函数的时候载入的区别呢。
不是系统启动,而是当客户端访问Account的getMessageCount这个事件时。
一般传统观点是,一次请求事件,对应一次响应结果,一般都是想在一次请求把所需要的结果全部获得,就象贪心馋嘴的小孩吃糖果一样,现在就不同了,搞清楚你所要结果的主次,先获得主要的,次要的再来一趟获取。
所以,getMessageCount要两次触发调用,第一次触发调用是激活查询或计算事件,第二次触发调用是获得计算结果。
这个类似专门JOB异步模式适合那些费时的计算和查询,再往上就可以使用hadoop等云计算
来对付。
但是,千里之行,始于足下,你必须首先分辨出你的业务哪些是费时费力的,而且不能将这些耗CPU计算推给数据库,然后再在架构设计上专门对待。
由于针对messageCount有一些专门操作,我们就不能直接在Account中实现这些操作,可以使用一个专门值对象实现
这里也体现了一个DDD
实践中什么时候使用值对象的一个原则,当围绕这些值字段有一些专门复杂操作时,就有必要独立出来做一个值对象,最近InfoQ 2009一个讲座就是谈这个问题的:Power Use of Value Objects in
DDD
他使用了电话号码为例子,因为在Action和Service中都涉及phoneNumber处理,所以,专门成立一个phoneNumber的值对象,如下:
Domain Events还可以实现懒加载大数据的预加载。
比如图片,只有显示图片时才会需要图片的二进制数据,这个数据比较大,所以,一般从持久层加载图片时,只加载图片其他核心文字信息,如图片ID,名称等,当需要显示时,再加载二进制数据输出真正图片。
下面是JiveJdon
的上传图片代码:
public
byte[] getData() {
byte[] bytes = super
.getData();
if
(bytes != null
)
return
bytes;
preloadData();
bytes = (byte[]) imgDataAsyncResult.getEventResult();
this
.setData(bytes);
return
bytes;
}
//预加载
public
void
preloadData() {
if
(imgDataAsyncResult == null
&& domainEvents != null
)
imgDataAsyncResult = this
.domainEvents.loadUploadEntity(this
);
}
|
上面preloadData可以在控制帖子显示的Action中预先调用一下,当帖子被输出到浏览器中时,帖子再通过html语法img调用上述getData数据,显示图片。
所以,html语法显示图片本身的异步
性和我们服务器端异步
结合在一起,这种模式可以适合大量图片显示场合。
特点是:显示快,因为当浏览器发出html的img语法调用服务器的图片时,服务器端图片一般已经预加载完成,准备就绪,只能调用,这比img语法到达服务器端时再进行图片大数据加载更有效。
该模式不但适合图片,也适合任何大数据对象。
参考并发策略可以解决延迟
传统意义上,懒加载和异步
都是好像不被人接受的,会带来比较差的性能,高延迟性,属于边缘技术,这其实是被误导了:并发策略可以解决延迟
懒加载和异步
代表的并发策略实际是一种潮流趋势,特别是作为并行计算语言Scala和erlang的新亮点:
函数式编程functional programming的特点
而最新发布JiveJdon
3.9使用传统Java,基于Jdon框架6.2实现了领域模型层的懒加载和异步
,可以完全克服Hibernate等ORM框架带来的Lazy懒加载错误问题。
JiveJdon3.0源码下载:http://www.jdon.com/jdonframework/download.html
在领域知识内不存在计算机技术的概念,你为什么要把技术层引入到DOMAIN呢
这是对的,但是因为Java语言的限制,如果采取基于Scala的Akka那种Actor Model
,而一个领域模型实际就是一个Actor,就非常自然了。Actor只能通过发送异步
消息和其他Actor通讯联系,这种消息发送是异步
的,属于“fire-and-forget”方式。
怎
样让领域模型驱动技术为其服务,不否认有更优雅的方式,权宜之举由领域模型发出事件消息不失是一种办法,而如果你将服务注射到领域模型,就不是一种事件驱
动架构(当然,还要将更多技术注射到领域模型)。而Domain
events相当于只注射一次,首先建立一个事件通道,以后就可以通过这个管道让Domain一次次发送事件消息来命令技术架构为其做事,相当于在两者之
间建立一个管道。
个人认为这是一种模拟Scala的Actor模型做法。
领域对象,仅仅关注自身和其他领域对象之间关系的建立,至于一切计算机领域的概念,都不应该出现在领域对象中,因为这是违背自然规律的组合,或者说是违背业务概念的。
非常赞同,让领域对象纯净,也是我的一个目标,这也是DDD
提出后,没有很多具体实现要求,因为目前具体实现离DDD
要求还很远。
就像是DCI架构
中所谈论的一样,我们现在很多OO
可能是因为被OO
实现所误导了。
关键是我们寻找到一个理想和现实结合之处,而不被实现误导,我也相当有兴趣讨论,包括自我批判挖掘。可另外开贴于你切磋。
相关参考:
Jdon框架异步
Domain Events实现内部原理:
使用future实现内置
异步
API
对象的职责
分享到:
相关推荐
在C#中,我们通常使用实体(Entities)、值对象(Value Objects)、领域事件(Domain Events)、聚合根(Aggregate Roots)、工厂(Factories)和仓储(Repositories)等DDD模式。例如,"中介实体"可能是一个业务中...
4. **领域事件(Domain Events)**:当领域状态发生改变时,可以发布领域事件,用于通知其他服务或组件。在Node.js中,可以使用EventEmitter或第三方库如`@async/queue`来处理异步事件。 5. **领域服务(Domain ...
通常,领域模型包含了业务实体(Entities)、值对象(Value Objects)、聚合(Aggregates)、领域事件(Domain Events)、服务(Services)以及领域驱动设计(DDD)中的其他元素。 1. **业务实体(Entities)**:...
4. **领域事件(Domain Events)**:用于记录领域内的重要变化,可以异步处理,与其他系统或服务通信。 5. **领域服务(Domain Services)**:处理跨越多个聚合的业务逻辑,不包含在任何实体或值对象中。 接下来,...
Node.js Domain(域) 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常。 Domain 模块可分为隐式绑定和显式绑定: 隐式绑定: 把在domain上下文中定义的变量,自动绑定到domain对象 显式绑定: 把不是...
2. **实体**:具有唯一标识的业务对象,如用户、订单等。 3. **值对象**:关注于其属性而非身份的对象,如地址、金额等。 4. **聚合**:一组相关实体和值对象,它们作为一个单元进行操作,以维护业务规则的一致性。 ...
2. 创建ALV控件。 3. 设置ALV属性。 4. 填充ALV数据。 5. 显示ALV。 - **1.2.2 显示ALV常用的两个FM** - `REUSE_ALV_GRID_DISPLAY`: 用于显示ALV网格。 - `REUSE_ALV_LIST_DISPLAY`: 用于显示ALV列表。 - **...
AS3通过`flash.system.ApplicationDomain`和`flash.events.EventDispatcher`监听和发送消息,JavaScript通过`window.postMessage`方法接收和发送消息。 4. 常见问题与解决方案 - **安全性问题**:由于安全限制,...
事件在DDD中扮演着重要的角色,特别是领域事件(Domain Events),它们记录了领域模型中的重要业务变化。 **事件基础(EventBase)** "EventBase"可能是指在DDD中用于处理和存储事件的基础类或框架。这个基础类...
"Imagine.Mes.MesInspection.Domain"是领域层的实现,包含了业务实体(Entities)、值对象(Value Objects)、领域事件(Domain Events)和领域服务(Domain Services)。这个层专注于业务规则和业务逻辑,确保了...
3. **领域事件(Domain Events)**:当领域中的某个重要状态发生改变时,会触发领域事件。这些事件可以异步处理,以保持领域模型的简洁性。在.NET Core中,可以使用事件总线(Event Bus)来处理领域事件。 4. **...
6. ** Domain Events **:领域事件记录了业务流程中的重要事件,可以用来实现异步处理,解耦不同的系统组件。 7. ** Strategic Design **:包括子域识别、上下文映射等策略,帮助确定不同Bounded Context之间的关系...
4. 领域事件(Domain Events):DDD中,领域事件用于表示领域模型中发生的有意义的业务事件。它们在业务操作完成后发布,可以用来触发异步处理或与其他系统通信。 5. 仓储(Repository):仓库是领域模型与持久化...
7. **领域事件(Domain Events)** 领域事件是在业务操作完成后发布的,用来通知系统其他部分发生了什么。在ASP.NET MVC中,可以使用事件总线或者直接订阅/发布机制来处理领域事件,实现解耦和异步处理。 8. **上...
- **domain.create()、domain.run(fn)**: 创建和运行领域对象。 #### 九、事件处理 - **事件: 'exit'**: 进程退出时触发。 - **事件: 'uncaughtException'**: 未捕获异常时触发。 - **Signal Events**: 处理操作...
Router1和Router2的E0端口均使用了C类地址192.1.0.0作为网络地址,Router1的E0的网络地址为192.1.0.128,掩码为255.255.255.192, Router2的E0的网络地址为192.1.0.64,掩码为255.255.255.192,这样就将一个C类网络地址...
在Flex应用中,可以通过创建一个FileReference对象,然后监听其events来触发文件选择对话框。用户选择文件后,FileReference对象会包含所选文件的信息,如文件名、大小等。然后,我们可以调用FileReference的upload...
2. **样式计算**:读取 CSS 样式并应用到 DOM 节点上。 3. **布局**:根据 DOM 和样式信息确定每个元素的位置。 4. **绘制**:将元素绘制到屏幕上。 5. **复合**:如果使用了 GPU 加速,则进行纹理上传和合成操作。 ...
- **异步处理**:命令和事件可以通过消息队列异步处理,以提高系统响应速度和容错能力。 通过分析这个CQRS.Demo项目,我们可以学习如何在实际应用中有效地划分职责,理解CQRS如何提高系统的可读性、可维护性和可...