这个页面展示了一个现代的 Apache Isis 应用程序的外观。
下边是Isis 插件里的 todoapp 示例 (非 ASF)截图,你可以随意使用。 界面里对应的领域类可以在这里找到。
这个 todoapp 同时集成了许多 Isis 插件 模块。因为我们觉得大部分应用终将会用到其中的一个或多个,我们选择包括这些插件的截图。
基础
我们从基础开始…
登录
Apache Isis 集成 Apache Shiro。核心框架支持基于文件的领域,同时 Isis 插件 安全模块 (非ASF) 提供了一个优良的用户子领域,角色和许可对应的功能继承于 Apache Isis metamodel。这个 todoapp 示例集成这个安全模块。
安装Fixtures
Apache Isis 有大量功能用于创建应用原型和全面的测试。比如其中的 fixture 脚本,可以向正在运行的程序安装预存的数据。这如果编故事有了一个好的开头;随后在功能开始实现的时候,相同的 fixture 脚本可重用于实现的功能的集成测试。 (后续测试用的更多)。
仪表盘和视图模型
多数时候最终用户界面都在展示持久化的领域实体,但 Apache Isis 还支持聚合多个数据源的视图模型。 todoapp 示例用了一个 "仪表盘"视图模型列出 todo 里的未处理完项与已完成项。
通常我们建议初始关注点只放在领域实体上;这样有助于驱动出好的领域模型。之后在视图模型上引入以支持特定的用户案例。
领域实体
下边的截图是todoapp的ToDoItem领域实体。如同其它的网页,这个界面在运行时直接从领域对象自身生成。没有控制器和
HTML 。
除领域实体外, Apache Isis 允许给予布局元数据提示, 比如指定属性分组,指定这些分组在列中的位置,动作(按钮)与属性或集合间的关联,按钮上的图标等。 元数据可以通过注解或XML的形式指定。带来的好处就是不用重启应用进行更新(重画界面)。
任何生产就绪的应用都需要这个元数据,不过 (像前边讨论的视图模型) 元数据可以逐步回到顶层的核心领域模型中。
编辑属性
领域实体的属性默认都是可以编辑的,意思就是可以直接更改。在 todoapp 例子里, ToDoItem的description就是一个可编辑的属性:
注意有些属性包括编辑模式都是只读的;每个属性都可以设为不可编辑。也可能禁用所有的属性以强制通过动作来更改 (往下)。
动作
修改实体的另一种方式是调用一个动作。下边的截图是 ToDoItem的目录和子目录可以用动作一起更新
:
不限制动作做哪些事情; 可能只更新单个对象,可以更新多个对象。或者根本不更新任何对象,但可以执行其它的一些活动,如发送或打印文档。
通常尽管所有动作都关联到一些对象,且由对象实现(仅初始化): 好的旧式封闭。我们有时用这个术语 "行为上完成" 表述这类的领域模型。
混元
用作领域对象上替换动(业务逻辑)作的备用品,可以代替换到一个 混元对象里边。对象被 Apache Isis渲染时,混元"贡献" 自己的行为给领域对象 (类似面向对象的样子).
下载截图中高亮了 "导出 xml" 动作, "相对优先级" 属性 (和 "上一步" 及 "下一步"动作) "类似" 集合和两个 "作为DTO" 动作都贡献了自己的混元:
可扩展视图
本页剩下的截图是 v1.10.0 的, 在 v1.12.0之前用在标签里的。 |
Apache Isis 用的是 Apache Wicket视图,设计上考虑了可扩展性。举例,当渲染一个对象的集合时,表现为多个视图中的一个,显示在下拉选框中:
类似的 Isis 插件 fullcalendar2 component (非ASF) 渲染任何实现Calendarable
接口的实体 (比如ToDoItem
) :
还有另一个 "视图" (相当简单)也是 Isis 插件叫excel component (非ASF)。上边有一个下载按钮将数据表变成电子表格:
上边的截图还展示了 "export to Word" 动作。 这个不算视图而是一个动作 (贡献) , Isis docx module (非ASF) 用于邮件合并:
注意 Isis 插件并不 ASF的组成部分,但他们都使用 Apache License 2.0 许可并且由Apache Isis 提交者维护. |
安全,审计等…
如同给 UI作扩展, (非 ASF) Isis 插件提供了一组丰富的模块用于支持各类划分的概念。
安全菜单通过安全模块提供了一组丰富的安全功能 :
原型菜单里可以下载 GNU gettext 格式文件 .po来做翻译。可以将此文件翻译成多种语言,以支持不同的地区。注意这个是
of Apache Isis 的核心功能(不是插件):
Isis 插件里还提供了管理应用程序和用户设置的模块。大部分应用不会直接开放这些服务 (包括todoapp这个示例) ,不过通常根据应用程序,把这些设置进行打包,而不是直接使用设置模块服务:
多权支持
安全模块 有着其它插件大部分的功能。有一个显著的功能是通过 "使用权" 将对象和用户关联起来。todoapp 示例中使用了这个功能,这样不同用户下todo 项就一直各自分开。管理员可以调整其它用户的 "使用权",用于获取访问对象的权限:
看多详情见 安全模块。
我
安全模块 的服务都建在安全模块之上,通常只能由管理指定。保持与 "me" 动作分开:
如果授予了权限,用户就可以访问与之相关的实体:
非必要的属性也可以通过安全或通过“内部事件总线”来隐藏(后边会介绍)。反之,可以使用前边所说贡献属性/集合将额外的属性“嫁接到”用户。
REST API
除了Apache Isis' Wicket 视图,还提供了丰富的REST API以及全部的超媒体控件,领域对象中自动生成(实体及视图模型)生成这些控件。框架提供了两种默认的展现形式,一个实现了 Restful Objects 规范,另一个适合自定义 Javascript 应用简单的表述。其它展现方式以插件的方式引入。
下边是用的Chrome插件来展示访问 Restful Objects 描述API 来访问的截图:
框架自动集成了Swagger,,生成领域对象模型的Swagger规范。这个规范下会生成 REST 客户端代码;然后用 通过Swagger UI 来访问REST API:
集成测试支持
前边我们注意到Apache Isis 可以通过界面来设置硬装。 相同的硬装脚本也可以在集成测试里重用。比如下边的代码片段展示了FixtureScripts
服务如何注入到集成测试中后来初始化数据的:
测试本身运行于 junit。而这些集成测试 (所谓的写到数据库),并不比常规的单元测试复杂:
Apache Isis里必须模拟业务规则,领域对象封装成代理。例如,如果使用Wicket视图,然后Apache Isis就会强制使用“结束项不能包含’结束‘行为”这个规则 ( ToDoItem类里的实现
)来调用。包装器在模拟的时候会抛出类似的异常:
内联事件总线
前边讨论的贡品,用于确保 Apache Isis 中包的唯一性;通过释放行为让各个包之间的依赖顺序得到有效的保留。
Apache Isis的内联事件总线是另一个确保可维护性的重要工具。用示例比较容易说明问题,下边边码演示了 "complete" 行为需要引发ToDoItem.Completed
事件:
领域服务 (应用程序范围,无状态)可以订阅事件:
这个测试验证结束一个行为引起订阅者的调用:
实际上,领域事件的触发不止一次,而是 (最高) 5 次。3次在执行期间,为了检查行为是否可用,启用行为并且参数有效。 执行为会更加优先调用,不过也可以执行后调用。这就是说如果行为可以使用,订阅者是否访问一些发布的对象,且或表现为级联的更新.
另外,所有的属性集合都可以触发领域事件,不仅是行为。因为,订阅都可以打开或关闭程序中某一部分。其实,示例 todoapp 已经演示了这个。