这个页面展示了一个现代的 Apache Isis 应用程序的外观。

下边是Isis 插件里的 todoapp 示例 (非 ASF)截图,你可以随意使用。 界面里对应的领域类可以在这里找到。

这个 todoapp 同时集成了许多 Isis 插件 模块。因为我们觉得大部分应用终将会用到其中的一个或多个,我们选择包括这些插件的截图。

基础

我们从基础开始…​

登录

Apache Isis 集成 Apache Shiro。核心框架支持基于文件的领域,同时 Isis 插件 安全模块 (非ASF) 提供了一个优良的用户子领域,角色和许可对应的功能继承于 Apache Isis metamodel。这个 todoapp 示例集成这个安全模块。

什么是Apache Isis-LMLPHP

安装Fixtures

Apache Isis 有大量功能用于创建应用原型和全面的测试。比如其中的 fixture 脚本,可以向正在运行的程序安装预存的数据。这如果编故事有了一个好的开头;随后在功能开始实现的时候,相同的 fixture 脚本可重用于实现的功能的集成测试。 (后续测试用的更多)。

什么是Apache Isis-LMLPHP

仪表盘和视图模型

多数时候最终用户界面都在展示持久化的领域实体,但 Apache Isis 还支持聚合多个数据源的视图模型。 todoapp 示例用了一个 "仪表盘"视图模型列出 todo 里的未处理完项与已完成项。

什么是Apache Isis-LMLPHP

通常我们建议初始关注点只放在领域实体上;这样有助于驱动出好的领域模型。之后在视图模型上引入以支持特定的用户案例。

领域实体

下边的截图是todoapp的ToDoItem领域实体。如同其它的网页,这个界面在运行时直接从领域对象自身生成。没有控制器和 HTML 。

什么是Apache Isis-LMLPHP

除领域实体外, Apache Isis 允许给予布局元数据提示, 比如指定属性分组,指定这些分组在列中的位置,动作(按钮)与属性或集合间的关联,按钮上的图标等。 元数据可以通过注解或XML的形式指定。带来的好处就是不用重启应用进行更新(重画界面)。

任何生产就绪的应用都需要这个元数据,不过 (像前边讨论的视图模型) 元数据可以逐步回到顶层的核心领域模型中。

编辑属性

领域实体的属性默认都是可以编辑的,意思就是可以直接更改。在 todoapp 例子里, ToDoItem的description就是一个可编辑的属性:

什么是Apache Isis-LMLPHP

注意有些属性包括编辑模式都是只读的;每个属性都可以设为不可编辑。也可能禁用所有的属性以强制通过动作来更改 (往下)。

动作

修改实体的另一种方式是调用一个动作。下边的截图是 ToDoItem的目录和子目录可以用动作一起更新:

什么是Apache Isis-LMLPHP

不限制动作做哪些事情; 可能只更新单个对象,可以更新多个对象。或者根本不更新任何对象,但可以执行其它的一些活动,如发送或打印文档。

通常尽管所有动作都关联到一些对象,且由对象实现(仅初始化): 好的旧式封闭。我们有时用这个术语 "行为上完成" 表述这类的领域模型。

混元

用作领域对象上替换动(业务逻辑)作的备用品,可以代替换到一个 混元对象里边。对象被 Apache Isis渲染时,混元"贡献" 自己的行为给领域对象 (类似面向对象的样子).

下载截图中高亮了 "导出 xml" 动作, "相对优先级" 属性 (和 "上一步" 及 "下一步"动作) "类似" 集合和两个 "作为DTO" 动作都贡献了自己的混元:

什么是Apache Isis-LMLPHP

可扩展视图

 

本页剩下的截图是 v1.10.0 的, 在 v1.12.0之前用在标签里的。

Apache Isis 用的是 Apache Wicket视图,设计上考虑了可扩展性。举例,当渲染一个对象的集合时,表现为多个视图中的一个,显示在下拉选框中:

什么是Apache Isis-LMLPHP

(非ASF) Isis 动作 库里有一些这个的扩展。例如 gmap3 组件 渲染实现了Locatable 接口的任何领域实体 (像 ToDoItem):

什么是Apache Isis-LMLPHP

类似的 Isis 插件 fullcalendar2 component (非ASF) 渲染任何实现Calendarable 接口的实体 (比如ToDoItem) :

什么是Apache Isis-LMLPHP

还有另一个 "视图" (相当简单)也是 Isis 插件叫excel component (非ASF)。上边有一个下载按钮将数据表变成电子表格:

什么是Apache Isis-LMLPHP

上边的截图还展示了 "export to Word" 动作。 这个不算视图而是一个动作 (贡献) , Isis docx module (非ASF) 用于邮件合并:

什么是Apache Isis-LMLPHP
 

注意 Isis 插件并不 ASF的组成部分,但他们都使用 Apache License 2.0 许可并且由Apache Isis 提交者维护.

安全,审计等…​

如同给 UI作扩展,  (非 ASF) Isis 插件提供了一组丰富的模块用于支持各类划分的概念。

活动菜单下有4组服务支撑 用户会话/审计 , 命令扼要(对象变更) 审计 (展示) 及(内部系统) 事件发布

什么是Apache Isis-LMLPHP

安全菜单通过安全模块提供了一组丰富的安全功能 :

什么是Apache Isis-LMLPHP

原型菜单里可以下载 GNU gettext 格式文件 .po来做翻译。可以将此文件翻译成多种语言,以支持不同的地区。注意这个是of Apache Isis 的核心功能(不是插件):

什么是Apache Isis-LMLPHP

Isis 插件里还提供了管理应用程序和用户设置的模块。大部分应用不会直接开放这些服务 (包括todoapp这个示例) ,不过通常根据应用程序,把这些设置进行打包,而不是直接使用设置模块服务:

什么是Apache Isis-LMLPHP

多权支持

安全模块 有着其它插件大部分的功能。有一个显著的功能是通过 "使用权" 将对象和用户关联起来。todoapp 示例中使用了这个功能,这样不同用户下todo 项就一直各自分开。管理员可以调整其它用户的 "使用权",用于获取访问对象的权限:

什么是Apache Isis-LMLPHP

看多详情见 安全模块

安全模块 的服务都建在安全模块之上,通常只能由管理指定。保持与 "me" 动作分开:

什么是Apache Isis-LMLPHP

如果授予了权限,用户就可以访问与之相关的实体:

什么是Apache Isis-LMLPHP

非必要的属性也可以通过安全或通过“内部事件总线”来隐藏(后边会介绍)。反之,可以使用前边所说贡献属性/集合将额外的属性“嫁接到”用户。

主题

Apache Isis' Wicket 实力使用 Twitter Bootstrap,这就意味着可以设置主题。如果应用中配置了多个主题,最终用户就可以切换实力的风格了:

什么是Apache Isis-LMLPHP

REST API

除了Apache Isis' Wicket 视图,还提供了丰富的REST API以及全部的超媒体控件,领域对象中自动生成(实体及视图模型)生成这些控件。框架提供了两种默认的展现形式,一个实现了 Restful Objects 规范,另一个适合自定义 Javascript 应用简单的表述。其它展现方式以插件的方式引入。

下边是用的Chrome插件来展示访问 Restful Objects 描述API 来访问的截图:

什么是Apache Isis-LMLPHP

框架自动集成了Swagger,,生成领域对象模型的Swagger规范。这个规范下会生成 REST 客户端代码;然后用 通过Swagger UI 来访问REST API:

什么是Apache Isis-LMLPHP

集成测试支持

前边我们注意到Apache Isis 可以通过界面来设置硬装。 相同的硬装脚本也可以在集成测试里重用。比如下边的代码片段展示了FixtureScripts 服务如何注入到集成测试中后来初始化数据的:

什么是Apache Isis-LMLPHP

测试本身运行于 junit。而这些集成测试 (所谓的写到数据库),并不比常规的单元测试复杂:

什么是Apache Isis-LMLPHP

Apache Isis里必须模拟业务规则,领域对象封装成代理。例如,如果使用Wicket视图,然后Apache Isis就会强制使用“结束项不能包含’结束‘行为”这个规则 ( ToDoItem类里的实现)来调用。包装器在模拟的时候会抛出类似的异常:

什么是Apache Isis-LMLPHP

内联事件总线

前边讨论的贡品,用于确保 Apache Isis 中包的唯一性;通过释放行为让各个包之间的依赖顺序得到有效的保留。

Apache Isis的内联事件总线是另一个确保可维护性的重要工具。用示例比较容易说明问题,下边边码演示了 "complete" 行为需要引发ToDoItem.Completed 事件:

什么是Apache Isis-LMLPHP

领域服务 (应用程序范围,无状态)可以订阅事件:

什么是Apache Isis-LMLPHP

这个测试验证结束一个行为引起订阅者的调用:

什么是Apache Isis-LMLPHP

实际上,领域事件的触发不止一次,而是 (最高) 5 次。3次在执行期间,为了检查行为是否可用,启用行为并且参数有效。 执行为会更加优先调用,不过也可以执行后调用。这就是说如果行为可以使用,订阅者是否访问一些发布的对象,且或表现为级联的更新.

另外,所有的属性集合都可以触发领域事件,不仅是行为。因为,订阅都可以打开或关闭程序中某一部分。其实,示例 todoapp 已经演示了这个。

05-12 17:24