经过半个多月的开发,我的BAC框架正式发布0.2版。本来预计是春节前发布,但是最近比较闲,用于开发的时间也增加了很多,框架提前完成。
0.2版在修正了0.1版错误的基础新增了验证码组件、DomainEvent框架和工具类。地址是:
http://code.google.com/p/basicaidedcomponent/,欢迎大家前往下载试用。同时我在Google注册了一个论坛
http://groups.google.com/group/bac_china/,不过访问总是时灵时不灵的。
说完了框架发布,我在这里谈一下0.2中比较特别的DomainEvent框架。这也是希望大家不要投新手帖。在这里发布自有框架,总会被贴上几个新手帖。一个弄不好就被丢到新手区了。
DomainEvent框架是为了解决实体与服务的交互而提出来的。在我们日常开发中,领域对象和Service的交互有时候需要领域对象调用Service。
比如我们有一个班级类,班级里有List保存学生对象。现在要求有一个统计学生的功能。如果完全按照领域驱动设计,这个功能应该是班级类自己的工作。如果所有的对象都在内存中,倒也没什么,直接统计一下List里学生对象数量就是。
public class Clazz {
//学生
List students;
public int getStudentSize() {
return students.size();
}
}
但是实际上这些对象都是保存在数据库中的。我们需要使用ORM工具获取Clazz,而一般学生列表是延迟加载的。在读取students列表时,ORM再加载学生实例。如果我们需要学生列表数据也罢了,但是如果我们只是要一个学生数量,那么将所有的学生对象加载就是非常不合算的事情。也许有人说写查询语句直接让数据库统计一下就是,比如下面:
select count(s) from student s where s.clazz.id = ?
但是问题是如何调用呢?总不能写成下面这种代码
public class Clazz {
//学生
List students;
//一个学生Service对象,用于处理学生相关业务
StudentService service;
public int getStudentSize() {
return service.getStudentSize(this.id);
}
}
很明显,实体和服务产生了紧耦合。先不说我们如何把StudentService注入Clazz的实例中,就是可以注入,产生的紧耦合也使得Clazz和StudentService绑到了一块。如果写成单独的Dao或者Service方法,那么就可能造成Clazz只是一个纯粹的持久化对象,没有了任何业务。
2008年Udi Dahan在其博客
How to create fully encapsulated Domain Models一文中也提出这个问题。一个实体模型中的方法参数依赖服务或者Repository,那么就会造成实体和服务的紧耦合。
2009年6月14日作者在征询很多意见后,再次在其博客
Domain Events – Salvation提出了Domain Event的解决方案。采用了事件/消息模型对实体和服务进行解耦。
定义一个事件接口
public interface DomainEvent<T> {
/**
* 获得发生Event的对象
* @return Event的对象
* @since 0.2
*/
public T getSource();
/**
* 获得Event类型
* @return Event类型
* @since 0.2
*/
public String getType();
}
然后定义监听器接口
public interface DomainListener {
/**
* 处理事件
* @param event 事件
* @since 0.2
*/
public void handler(DomainEvent event);
}
现在我们可以实现一个Listenrer,把查询学生人数的代码放到监听器里。
public class StudentListener implements DomainListener {
StudentService service;
public void handler(DomainEvent event) {
if (event.getType().equlas("getStudentSize") {
int size = service.getStudentSize(event.getSource().getId());
event.getSource().setStudentSize(size);
}
}
}
然后Clazz只要在需要查询人数的时候发出一个事件。
public class CLazz{
int studentSize;
public void getStudentSize() {
DomainEventManager.disptcher(new DefaultDomainEvent(this, "getStudentSize"));
}
}
//一个简单的DomainEvent实现
public class DefaultDomainEvent implements DomainEvent {
private Object object;
private String type;
public DefaultDomainEvent(Object object, String type) {
this.object = object;
this.type = type;
this.sync = sync;
}
public Object getSource() {
return object;
}
public String getType() {
return type;
}
}
监听器在收到事件后就会自动调用代码进行查询,并把查询结果放到Clazz中。这里只进行一些简单描述。大家想看完整的DomainEvent代码,可以下载我的BAC框架。
disptcher会将事件交给事件管理器,事件管理器是一个Command模式,它调用Listener对事件进行处理。
public class DomainEventManager{
/**
* 已注册的监听器集合
*/
private final static Map<Class, List<DomainListener>> listenerMap = new ConcurrentHashMap<Class, List<DomainListener>>();
/**
* 处理事件
* @param event
* @since 0.2
*/
public static void dispatch(DomainEvent event) {
//如果存在该类的监听器
if (hasClassListener(event.getSource().getClass())) {
List<DomainListener> listenerList = getClassListeners(event.getSource().getClass());
//循环监听器,这是一个典型的Command模式
for (DomainListener listener : listenerList) {
listener.handler(event);
}
}
}
}
这样实体和服务就分开了。不会造成实体和服务的紧耦合。
分享到:
相关推荐
**Bac-to-Bac杆状病毒表达系统**是一种高效便捷的重组蛋白表达工具,尤其适用于在昆虫细胞中实现目的基因的高水平表达。该系统的核心原理是利用杆状病毒的Tn7转座子机制,将含有目的基因的pFastBac捐赠质粒插入到E. ...
Bac-to-Bac 杆状病毒表达系统 Bac-to-Bac 杆状病毒表达系统是一种快速有效的方法,用于产生重组杆状病毒。该系统基于让已经转入杆状病的质粒(杆粒)的位点特意转座子的表达框的质粒在 Ecoli 中扩增。 该系统的...
Android statusBar添加bac
**Bac-to-Bac杆状病毒表达系统**是一种高效、快速的重组病毒生成工具,尤其适用于在昆虫细胞中实现目标基因的高水平表达。该系统基于Tn7位点特异性转座子机制,大大简化了重组病毒的构建过程,减少了传统同源重组...
【Bac-to-Bac杆状病毒表达系统】是一种高效、快速的重组病毒生成技术,尤其适用于在昆虫细胞中实现目标基因的高水平表达。该系统基于Tn7位点特异性转座子机制,大大简化了传统同源重组过程,缩短了从克隆到重组病毒...
【Bac-to-Bac杆状病毒表达系统】是一种在昆虫细胞中高效表达目的基因的生物技术,主要用于蛋白质功能研究和生产。该系统基于Tn7位点特异性转座子的机制,简化了重组杆状病毒的生成过程,提高了实验效率。 **系统...
【华南理工大学2008年计算机类研究生入学上机试题】是本次讨论的主题,这个压缩文件"BAC.rar_bac"包含了一份重要的文档——"bac.doc",很显然,它是华南理工大学2008年计算机科学与技术或相关专业研究生入学考试的...
还有B2F(Business to Family)、G2G(Government to Government)、B2B2C(Business to Business to Consumer)、B4C(Business for Consumer)和BAC(Business Assisted Commerce)等新型电子商务模式,它们在...
Elco-宜科 条码阅读器-BAC 48产品手册pdf,Elco-宜科 条码阅读器-BAC 48产品手册
### 迅饶BACnet 网关BAC1002-ARM #### 一、产品概述 迅饶BACnet 网关BAC1002-ARM是一款高性能、多功能的网关设备,专门用于实现不同通信协议之间的转换,特别是将各种设备连接到BACnetIP网络中。该网关适用于楼宇...
### 惠普业务可用性中心(HP BAC)知识点详解 #### 一、概述 惠普业务可用性中心(HP Business Availability Center,简称HP BAC)是一款强大的业务可用性管理解决方案,它专为Windows和Solaris操作系统设计,旨在...
基于Spring Boot框架的秒杀系统 项目简介 本项目是一个基于Spring Boot框架的秒杀系统,主要用于学习秒杀、多并发、性能提升等方面的知识。项目整合了支付宝支付功能,并采用了多种技术栈来优化系统性能和用户...
软件特点: -绿色免安装,支持中英文; -支持60种协议同时转为BACnet IP服务器; -支持WEB浏览,查看,设置,进行监视和控制; -支持线性转换,取位,高低字节转换; -配置软件X2BACnet配置工程方便,1000个点20分钟内...
在详细解读“BAC-S-MOD-M配置软件使用说明.pdf”文档内容后,我们可以提炼以下IT知识点: ### BAC-S-MOD-M配置软件功能及应用 1. **软件目的:** 该配置软件主要用于对BAC-S-MOD-M网关进行参数配置,包括网关的IP...
Elco-宜科 条码阅读器-BAC500产品手册pdf,Elco-宜科 条码阅读器-BAC500产品手册
本文主要探讨了基于框架的Linux安全增强开发技术,通过分析Linux Security Module (LSM) 和Rule Set Based Access Control (RS-BAC) 实现的Generalized Framework of Access Control (GFAC) 框架,以提高Linux操作...