這個頁面展示了一個現代的 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的目錄和子目錄可以用動作一起更新
:
不限制動作做哪些事情; 可能只更新單個對象,可以更新多個對象。或者根本不更新任何對象,但可以執行其它的一些活動,如發送或打印文檔。
通常盡管所有動作都關聯到一些對象,且由對象實現(僅初始化): 好的舊式封閉。我們有時用這個術語 "行為上完成" 表述這類的領域模型。
可擴展視圖
本頁剩下的截圖是 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 中包的唯一性;通過釋放行為讓各個包之間的依賴順序得到有效的保留。
Apache Isis的內聯事件總線是另一個確保可維護性的重要工具。用示例比較容易說明問題,下邊邊碼演示了 "complete" 行為需要引發ToDoItem.Completed
事件:
領域服務 (應用程序范圍,無狀態)可以訂閱事件:
這個測試驗證結束一個行為引起訂閱者的調用:
實際上,領域事件的觸發不止一次,而是 (最高) 5 次。3次在執行期間,為了檢查行為是否可用,啟用行為並且參數有效。 執行為會更加優先調用,不過也可以執行后調用。這就是說如果行為可以使用,訂閱者是否訪問一些發布的對象,且或表現為級聯的更新.
另外,所有的屬性集合都可以觸發領域事件,不僅是行為。因為,訂閱都可以打開或關閉程序中某一部分。其實,示例 todoapp 已經演示了這個。