发给有缘人

14-03-22 32647908
又来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 好.

1
banq
2014-03-22 18:23
多谢分享宝贵经验。实在感谢。

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

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

lostalien
2014-03-23 12:08
能说一下你们是怎么在springmvc_jpa的结构中融入的reactor吗?

32647908
2014-03-25 16:19

@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();
    }

}
<p>

在 service 或 controller 中

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

抛出事件

  @[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;
    }
<p>

处理事件

    @[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);
    }
<p>

猜你喜欢