经过半个多月的开发,我的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表达系统中文版说明书.pdf
Bac_to_bac表达系统中文版说明书.pdf
Bac_to_bac表达系统中文版说明书.doc
Bac-to-bac表达系统中文版说明书模板.doc
Android statusBar添加bac
Bac-to-Bac杆状病毒表达系统.doc
详细介绍了SiteScope的安装 以及如何与BAC集成
迅饶BACnet 网关BAC1002-ARM
Elco-宜科 条码阅读器-BAC 48产品手册pdf,Elco-宜科 条码阅读器-BAC 48产品手册
BAC-S-MOD-M配置软件使用说明pdf,BAC-S-MOD-M配置软件使用说明
软件特点: -绿色免安装,支持中英文; -支持60种协议同时转为BACnet IP服务器; -支持WEB浏览,查看,设置,进行监视和控制; -支持线性转换,取位,高低字节转换; -配置软件X2BACnet配置工程方便,1000个点20分钟内...
玉米BAC在玉米有丝分裂染色体上FISH体系的构建,陶勇生,张祖新,本研究以玉米BAC片段为探针,在玉米根尖有丝分裂的细胞学制片上进行BAC-FISH研究,分别探讨了玉米和水稻基因组C0t DNA对探针重复序列的
Elco-宜科 条码阅读器-BAC500产品手册pdf,Elco-宜科 条码阅读器-BAC500产品手册
华南理工大学2008年计算机类研究生入学上机试题
BAC0 BAC0是一个Python 3(3.5及更高版本)脚本应用程序,它使用处理IP网络上的BACnet消息。 该库带出简单的命令来浏览BACnet网络,从BACnet设备读取属性或对其进行写入。 Python是一种简单易学的语言,并且是用于...
业务服务管理解决方案提供对从业务服务到 IT 基础设施的综合的监控管理
使用Java+Maven+Selenium+TestNG+Jedis+Jenkins搭建的WebUI自动化测试框架,资源的大体介绍如下链接http://note.youdao.com/noteshare?id=dc564343fd126f497074f6d7560c9f5e&sub=387EB3B1BAC945CEA71A5BDBC6484473
BAC产品知识讲稿.pptx
bac.obj