VaughnVernon/IDDD案例

VaughnVernon/IDDD_Samples · GitHub

这是一个基于Vaughn Vernon的"Implementing Domain-Driven Design"简称(IDDD) 特定场景的开源案例。

模型和围绕其的架构技术随着时间迁移表现为各种不断变化的状态。

有四个子项目组成:

iddd_agilepm 项目是一个以LevelDB这样key-value存储作为持久层的案例,LevelDB 是一个纯Java实现: https://github.com/dain/leveldb

iddd_agilepm并没有使用任何容器(such as Spring).

iddd_collaboration项目是一个使用 Event Sourcing 和
CQRS的案例.它避免使用了ORM之类框架,展示基于JDBC的查询引擎. 这样技术虽然有其局限性,但是意味着小而快,无需任何元注解之类配置,虽然不完美。

iddd_collaboration项目展示它持久Event Sourced写模型和在另外一个线程实现CQRS的读模型. 使用LevelDB进行事件存储播放而 MySQL用于读模型的存储。也许两者之间有些数据不一致,可实现最终一致性。

The iddd_identityaccess 项目是使用ORM作为持久(Hibernate), 但是也没有被它干扰,提供一个RESTful客户端接口,通过REST (logs) 和 RabbitMQ.可发送Domain-Event提醒,


iddd_common 项目提供许多可重用组件,虽然并不试图成为一个框架,但是能提高代码重用。

我打开其中一个Person领域模型代码


public void changeContactInformation(ContactInformation aContactInformation) {
this.setContactInformation(aContactInformation);

DomainEventPublisher
.instance()
.publish(new PersonContactInformationChanged(
this.tenantId(),
this.user().username(),
this.contactInformation()));
}


它是通过 DomainEventPublisher.instance()静态变量直接发送事件,在Jdonframework中是通过注入的一个发送事件角色进行发送。

看书的目录,感觉不错,期待国内引进。

他很早以前就写过一个Effective Aggregate Design的系列的,分三篇文章,在DDD的官网上。不过现在打不开了。


这个是书本作者接受采访的内容



public class DomainEventPublisher {

private static final ThreadLocal<DomainEventPublisher> instance = new ThreadLocal<DomainEventPublisher>() {
protected DomainEventPublisher initialValue() {
return new DomainEventPublisher();
}
};

private boolean publishing;

@SuppressWarnings("rawtypes")
private List subscribers;

public static DomainEventPublisher instance() {
return instance.get();
}

........

作者用了ThreadLocal的方式来获取DomainEventPublisher的实例,不知用意为何??哪位可以指点一下???

使用Thread local保证一个线程触发的系列动作中只有一个事件,如果用作web服务器,一个请求对应一个事件,防止产生过多事件。

不好意思 又看了几遍 好像还是没弄明白 能否再仔细说一下?

貌似不用threadlocal也没太大问题 本身threadlocal好像解决的只是线程安全问题