使用JF可以轻松实现DCI架构。事件的生产者实际是DCI中的角色,JF运行时通过将角色注入到模型中实现其角色扮演功能。
DCI:数据Data, 场景Context, 交互Interactions是由MVC发明者Trygve Reenskaug发明的。 见 DCI架构是什么? DCI让我们的核心模型更加简单,只有数据和基本行为。业务逻辑等交互行为在角色模型中 在运行时的场景,将角色的交互行为注射到数据中。
JdonFramework的Domain Events是DCI的交互行为,在实现领域事件的同时也实现了DCI。为更清楚说明DCI,下面以JdonFramework案例说明。源码见: SimpleJdonFrameworkTest.rar
领域模型是DCI的Data,只有数据和基本行为,更简单,但注意不是只有setter/getter的贫血模型。如下:
@Model public class User Model {
private String userId; private String name;
@Inject private ComputerRole computerRole;
|
Domain Events事件或消息的生产者也就是DCI中的角色Role,比如我们有一个专门进行计数计算的角色,实际上真正计算核心因为要使用关系数据库等底层技术架构,并不真正在此实现,而是依托消息消费者@Consumer实现,那么消息生产者可以看出是一个接口,消费者看成是接口的实现:
@Introduce("message") public class ComputerRole {
@Send("computeCount") public DomainMessage computeCount(User[author]Model[/author] user) { return new DomainMessage(user); }
@Send("saveUser") public DomainMessage save(User[author]Model[/author] user) { return new DomainMessage(user); }
}
|
DCI第三个元素是场景上下文Context,在这个场景下,ComputeRole将被注入到模型UserModel中,实现计数计算的业务功能:
public class ComputeContext {
private DomainMessage ageAsyncResult;
public void preloadData(User[author]Model[/author] user) { if (ageAsyncResult == null) ageAsyncResult = user.getUserDomainEvents().computeCount(user); }
public int loadCountNow(User[author]Model[/author] user) { preloadData(user); return (Integer) ageAsyncResult.getEventResult(); }
public int loadCountByAsync(User[author]Model[/author] user) { if (ageAsyncResult == null) ageAsyncResult = user.getUserDomainEvents().computeCount(user); else if (ageAsyncResult != null) return (Integer) ageAsyncResult.getEventResult(); return -1;
} }
|
DCI应用源码下载:SimpleJdonFrameworkTest.rar
开发文档:JdonFramework模型驱动快速开发
更多文档:http://www.jdon.com/jdonframework/manual.htm
关于领域事件和DCI纠结讨论见:
DCI,领域模型,领域事件的一些想法,该文讨论场景和事件到底应该如何结合?怎么结合?
DCI并不反对继承 一文认为DCI目前最大的不确定性或者说问题是何时以及如何定义一个Context上下文场景?我个人认为通过领域事件实际上巧妙回避了这个问题,因为事件隐含了场景。
[该贴被banq于2011-09-10 17:09修改过]
[该贴被banq于2011-09-13 12:14修改过]