发给有缘人

又来jdon逛了一圈. 留点感想吧.
1:从来没有聚合根,不要去寻找聚合根.如果硬要找聚合根,那当下你系统中的entity就是.
为什么关于怎么样找和确认、确定一个聚合根很困难,因为一万个人基本上有一万个想法.
因为方向错了,所以你无法证明你是对的.也无法证明对方是错的. 此时剩下了 耍赖皮或专制 强制 属下
同意你的意见. 很不优雅. 也很低级.

2:事件 与 日志 是必要的. 明确划分流程或业务的生命阶段. 在每个阶段或周期 抛出相应的事件. 记录必要的日志.
这里有同学可能要问了.如何明确划分流程的生命阶段? 这个刚开始你只可以划分 开始 结束 .这两个.然后想清楚加入就是了 .
说说我现在的一些开发工具和方法 spring mvc jpa
异步事件机制 采用的是 https://github.com/reactor/reactor
数据库(分库) main database、 event+logDatabase 、history database 、report database.

3:读写分离. 这已是经过实践的好东西. 也必须要要.

4:每一个请求 或 命令 必定包含同步和异步两个东西. 有些必须同步的,我们就要等他同步执行.

5: 富模型 贫模型 不必过于计较,灵活使用. 就ok. 不要被一些大师或好的框架绑架 .
例如 虽然我被spring mvc jpa 影响很深 .但我们的报表模块 . 直接 使用 jfinal 这个国人的产品来做觉得
只做查询和少量其他无关紧要的数据库操作.他就要比 spring mvc+jap 好.


多谢分享宝贵经验。实在感谢。

但是关于第一点不敢苟同,聚合或者称为凝聚是事物的一个特征,否则我们就无法给其取一个名称了,面向对象中之所以提出单一职责,也是从职责的凝聚性考虑的,参考:http://www.jdon.com/designpatterns/the-single-responsibility-principle.html

当然,有关聚合边界问题可能是模糊的,多人的观点不一定一致,但是核心(聚合根)也是能够取得同意的。

能说一下你们是怎么在springmvc_jpa的结构中融入的reactor吗?



@Configuration
@EnableReactor
public class ReactorConfig {

@Bean(name = "[author]rootReactor[/author]")
public Reactor [author]rootReactor[/author](Environment env) {
return Reactors.reactor().env(env).get();
}

@Bean(name = "reportReactor")
public Reactor reportReactor(Environment env) {
return Reactors.reactor().env(env).get();
}

}

在 service 或 controller 中


@[author]Autowired[/author]
@[author]Qualifier[/author]("[author]rootReactor[/author]")
public Reactor r;

抛出事件


@[author]Transactional[/author]
public int updateWareName(WareIn in) {
WareIn ware = wareInDao.findOne(in.getId());
if (ware != null) {
ware.setUpdateColumn("商品名称");
ware.setOldValue(ware.getName());
ware.setNewValue(in.getName());
ware.setName(in.getName());
ware.setOperator(Yun.getOperator());
r.notify("updateWareLog", Event.wrap(ware));
return 1;
}
return 0;
}

处理事件


@[author]Selector[/author](value = "updateWareLog", reactor = "@[author]rootReactor[/author]")
public void updateWareLog(Event<WareIn> evt) {
//添加修改商品日志
WareIn ware = evt.getData();
Person person = ware.getOperator().getPerson();
WareLog log = new WareLog(ware.getName(), ware.getId(), OperatorStatus.UPDATE, ware.getUpdateColumn(), ware.getOldValue(), ware.getNewValue(), person.getName(), person.getId());
wareLogDao.save(log);
}