POCOs
这些编码约定增加了可选的行为。你必须遵守三种简单的编码约定。有两种是应用在属性上的,如下所示:
get {
Resolve(employee);
return employee;
}
set {
employee = value;
ObjectChanged();
}
}
Resolve()调用确保对象已经被加载到内存中,而ObjectChanged()则会通知框架属性值已经改变。两者都是为了更新对象的视图,以及确保改变被持久化。(注意框架会为你自动化处理持久化:你不需要为加载、保存和更新对象编写任何方法)。
第三个要求是你编程创建的任何对象都必须通知框架。你不能这样写:
而需要这样:
这些调用并不是Naked Objects框架要求的,而只是将其委托给定义在IDomainObjectContainer中的方法。如果你为你的对象类型提供了一个属性,框架就会将其注入到容器中,该容器在运行时为你实现这些功能。作为一种快捷方式,你可以选择让域对象继承自AbstractDomainObject,它可以代替你为每种情形生成这几行代码。
但是必须声明的重点是继承是可选的:Naked Objects是一个基于POCO(Plain Old CLR Object,普通旧式CLR对象)的方式。除了通常意义上POCO所具有的优势外,它还意味着你可以选择使用相同的域对象,并将其运行在更加广泛的架构中:编写必要的用户界面和其他层。你所需要做的就是为容器提供这三类调用的存根代码。(如果你希望使用面向方面编程,你可以从域代码中去除Resolve(),ObjectChanged()和newTransientInstance()调用,但是我们不希望将Naked Objects与具体的AOP实现紧密耦合。)
Naked Objects引人入胜之处是你可以只使用它就能够支持开发过程中的领域驱动设计:Naked Objects不会强迫你必须要实现整个系统。还有一个好消息是你可以只使用Naked Objects的表达式编辑器,它可以免费下载。