什么是Apache Isis


這個頁面展示了一個現代的 Apache Isis 應用程序的外觀。

下邊是Isis 插件里的 todoapp 示例 (非 ASF)截圖,你可以隨意使用。 界面里對應的領域類可以在這里找到。

這個 todoapp 同時集成了許多 Isis 插件 模塊。因為我們覺得大部分應用終將會用到其中的一個或多個,我們選擇包括這些插件的截圖。

基礎

我們從基礎開始…​

登錄

Apache Isis 集成 Apache Shiro。核心框架支持基於文件的領域,同時 Isis 插件 安全模塊 (非ASF) 提供了一個優良的用戶子領域,角色和許可對應的功能繼承於 Apache Isis metamodel。這個 todoapp 示例集成這個安全模塊。

010 login

安裝Fixtures

Apache Isis 有大量功能用於創建應用原型和全面的測試。比如其中的 fixture 腳本,可以向正在運行的程序安裝預存的數據。這如果編故事有了一個好的開頭;隨后在功能開始實現的時候,相同的 fixture 腳本可重用於實現的功能的集成測試。 (后續測試用的更多)。

020 install fixtures

儀表盤和視圖模型

多數時候最終用戶界面都在展示持久化的領域實體,但 Apache Isis 還支持聚合多個數據源的視圖模型。 todoapp 示例用了一個 "儀表盤"視圖模型列出 todo 里的未處理完項與已完成項。

030 dashboard view model

通常我們建議初始關注點只放在領域實體上;這樣有助於驅動出好的領域模型。之后在視圖模型上引入以支持特定的用戶案例。

領域實體

下邊的截圖是todoapp的ToDoItem領域實體。如同其它的網頁,這個界面在運行時直接從領域對象自身生成。沒有控制器和 HTML 。

040 domain entity

除領域實體外, Apache Isis 允許給予布局元數據提示, 比如指定屬性分組,指定這些分組在列中的位置,動作(按鈕)與屬性或集合間的關聯,按鈕上的圖標等。 元數據可以通過注解或XML的形式指定。帶來的好處就是不用重啟應用進行更新(重畫界面)。

任何生產就緒的應用都需要這個元數據,不過 (像前邊討論的視圖模型) 元數據可以逐步回到頂層的核心領域模型中。

編輯屬性

領域實體的屬性默認都是可以編輯的,意思就是可以直接更改。在 todoapp 例子里, ToDoItem的description就是一個可編輯的屬性:

050 edit property

注意有些屬性包括編輯模式都是只讀的;每個屬性都可以設為不可編輯。也可能禁用所有的屬性以強制通過動作來更改 (往下)。

動作

修改實體的另一種方式是調用一個動作。下邊的截圖是 ToDoItem的目錄和子目錄可以用動作一起更新:

060 invoke action

不限制動作做哪些事情; 可能只更新單個對象,可以更新多個對象。或者根本不更新任何對象,但可以執行其它的一些活動,如發送或打印文檔。

通常盡管所有動作都關聯到一些對象,且由對象實現(僅初始化): 好的舊式封閉。我們有時用這個術語 "行為上完成" 表述這類的領域模型。

混元

用作領域對象上替換動(業務邏輯)作的備用品,可以代替換到一個 混元對象里邊。對象被 Apache Isis渲染時,混元"貢獻" 自己的行為給領域對象 (類似面向對象的樣子).

下載截圖中高亮了 "導出 xml" 動作, "相對優先級" 屬性 (和 "上一步" 及 "下一步"動作) "類似" 集合和兩個 "作為DTO" 動作都貢獻了自己的混元:

065 contributions

可擴展視圖

 

本頁剩下的截圖是 v1.10.0 的, 在 v1.12.0之前用在標簽里的。

Apache Isis 用的是 Apache Wicket視圖,設計上考慮了可擴展性。舉例,當渲染一個對象的集合時,表現為多個視圖中的一個,顯示在下拉選框中:

070 pluggable views

(非ASF) Isis 動作 庫里有一些這個的擴展。例如 gmap3 組件 渲染實現了Locatable 接口的任何領域實體 (像 ToDoItem):

080 gmap3 view

類似的 Isis 插件 fullcalendar2 component (非ASF) 渲染任何實現Calendarable 接口的實體 (比如ToDoItem) :

090 fullcalendar2 view

還有另一個 "視圖" (相當簡單)也是 Isis 插件叫excel component (非ASF)。上邊有一個下載按鈕將數據表變成電子表格:

100 excel view and docx

上邊的截圖還展示了 "export to Word" 動作。 這個不算視圖而是一個動作 (貢獻) , Isis docx module (非ASF) 用於郵件合並:

110 docx
 

注意 Isis 插件並不 ASF的組成部分,但他們都使用 Apache License 2.0 許可並且由Apache Isis 提交者維護.

安全,審計等…​

如同給 UI作擴展,  (非 ASF) Isis 插件提供了一組豐富的模塊用於支持各類划分的概念。

活動菜單下有4組服務支撐 用戶會話/審計 , 命令扼要(對象變更) 審計 (展示) 及(內部系統) 事件發布

120 auditing

安全菜單通過安全模塊提供了一組豐富的安全功能 :

130 security

原型菜單里可以下載 GNU gettext 格式文件 .po來做翻譯。可以將此文件翻譯成多種語言,以支持不同的地區。注意這個是of Apache Isis 的核心功能(不是插件):

140 i18n

Isis 插件里還提供了管理應用程序和用戶設置的模塊。大部分應用不會直接開放這些服務 (包括todoapp這個示例) ,不過通常根據應用程序,把這些設置進行打包,而不是直接使用設置模塊服務:

150 appsettings

多權支持

 安全模塊 有着其它插件大部分的功能。有一個顯著的功能是通過 "使用權" 將對象和用戶關聯起來。todoapp 示例中使用了這個功能,這樣不同用戶下todo 項就一直各自分開。管理員可以調整其它用戶的 "使用權",用於獲取訪問對象的權限:

160 switch tenancy

看多詳情見 安全模塊

我 

安全模塊 的服務都建在安全模塊之上,通常只能由管理指定。保持與 "me" 動作分開:

170 me

如果授予了權限,用戶就可以訪問與之相關的實體:

180 app user entity

非必要的屬性也可以通過安全或通過“內部事件總線”來隱藏(后邊會介紹)。反之,可以使用前邊所說貢獻屬性/集合將額外的屬性“嫁接到”用戶。

主題

Apache Isis' Wicket 實力使用 Twitter Bootstrap,這就意味着可以設置主題。如果應用中配置了多個主題,最終用戶就可以切換實力的風格了:

190 switch theme

REST API

除了Apache Isis' Wicket 視圖,還提供了豐富的REST API以及全部的超媒體控件,領域對象中自動生成(實體及視圖模型)生成這些控件。框架提供了兩種默認的展現形式,一個實現了 Restful Objects 規范,另一個適合自定義 Javascript 應用簡單的表述。其它展現方式以插件的方式引入。

下邊是用的Chrome插件來展示訪問 Restful Objects 描述API 來訪問的截圖:

200 rest api

框架自動集成了Swagger,,生成領域對象模型的Swagger規范。這個規范下會生成 REST 客戶端代碼;然后用 通過Swagger UI 來訪問REST API:

205 swagger ui

集成測試支持

前邊我們注意到Apache Isis 可以通過界面來設置硬裝。 相同的硬裝腳本也可以在集成測試里重用。比如下邊的代碼片段展示了FixtureScripts 服務如何注入到集成測試中后來初始化數據的:

210 fixture scripts

測試本身運行於 junit。而這些集成測試 (所謂的寫到數據庫),並不比常規的單元測試復雜:

220 testing happy case

Apache Isis里必須模擬業務規則,領域對象封裝成代理。例如,如果使用Wicket視圖,然后Apache Isis就會強制使用“結束項不能包含’結束‘行為”這個規則 ( ToDoItem類里的實現)來調用。包裝器在模擬的時候會拋出類似的異常:

230 testing wrapper factory

內聯事件總線

前邊討論的貢品,用於確保 Apache Isis 中包的唯一性;通過釋放行為讓各個包之間的依賴順序得到有效的保留。

Apache Isis的內聯事件總線是另一個確保可維護性的重要工具。用示例比較容易說明問題,下邊邊碼演示了 "complete" 行為需要引發ToDoItem.Completed 事件:

240 domain events

領域服務 (應用程序范圍,無狀態)可以訂閱事件:

250 domain event subscriber

這個測試驗證結束一個行為引起訂閱者的調用:

260 domain event test

實際上,領域事件的觸發不止一次,而是 (最高) 5 次。3次在執行期間,為了檢查行為是否可用,啟用行為並且參數有效。 執行為會更加優先調用,不過也可以執行后調用。這就是說如果行為可以使用,訂閱者是否訪問一些發布的對象,且或表現為級聯的更新.

另外,所有的屬性集合都可以觸發領域事件,不僅是行為。因為,訂閱都可以打開或關閉程序中某一部分。其實,示例 todoapp 已經演示了這個。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM