XAF新手入門 - XAF設計模式探討

来源:https://www.cnblogs.com/haoxj/archive/2022/11/01/16838871.html
-Advertisement-
Play Games

###前言 剛接觸XAF的小伙伴可能會有一個疑惑,XAF中有Model(BusinessObject)、View、Controller,感覺明顯是一個MVC的設計模式,但當你用MVC的設計模式與其對應時,又會發現有一些不一樣,可能這時有小伙伴會想會不會是MVC的變體,因為MVC只是一個設計模式,不同 ...


前言

剛接觸XAF的小伙伴可能會有一個疑惑,XAF中有Model(BusinessObject)、View、Controller,感覺明顯是一個MVC的設計模式,但當你用MVC的設計模式與其對應時,又會發現有一些不一樣,可能這時有小伙伴會想會不會是MVC的變體,因為MVC只是一個設計模式,不同的框架會根據自身的特點做一些改變是正常的,帶著這個疑惑,我們一起來探討一下XAF的設計模式。

MVC

MVC設計模式中的M是模型(Model),V是視圖(View),C是控制器(Controller),MVC的好處就是將Model與View進行了分離,也就是我們在軟體開發中常說的關註點分離,Model負責數據及業務邏輯,View負責數據展示及交互,這樣它們也可以被重覆使用,Controller會根據用戶的請求選擇Model,並返回對應的View。

image

XAF與MVC對比時,兩者的View與Model不管是在概念上還是在行為上都是一致的,但Controller卻有著不一樣的行為。

XAF中Controller的概念比較複雜,不僅有ViewController,還有WindowController等其它Controller,為了簡化方便理解,以下所說的XAF中的Controller就是指ViewController(ViewController也是XAF中用到最多的Controller)。

MVC中Controller的作用在前面已說過,同時Controller一般可以擁有多個View,反觀XAF中的Controller,不僅行為與MVC中的Controller不同,並且XAF中的View可以同時擁有多個Controller,感覺XAF中的Controller是View的Controller。熟悉XAF的小伙伴看到這裡也就明白了,XAF中的Controller就是針對View的,它應該屬於View的一部分,同時我們也可以得出結論,XAF中的Model、View、Controller並不是傳統的MVC模式。

MVVM

既然XAF不是MVC模式,那是什麼模式呢,這裡給出我的想法,它是MVVM模式。

MVVM是由Model(M)、View(V)、ViewModel(VM)組成,它們之間的數據傳遞實現了雙向綁定,也就是View中數據的變化會傳遞給ViewModel,同時ViewModel會更新Model,相反Model中數據的變化會傳遞給ViewModel,同時ViewModel也會更新View。熟悉XAF的小伙伴會發現XAF中發View與Model(BusinessObject)也是這樣工作的,如果你瞭解WPF,MVVM的概念更不會感到陌生,但這裡MVVM更像一個簡化版,它沒有WPF中Commnad與Service的概念。

image

上面我們談到了XAF中的Controller是View的一部分,那Controller與View就是一個整體,我們這裡統稱為View,而XAF中的Model(BusinessObject)就是ViewModel+Model,看到這裡肯定會有小伙伴感到疑惑,XAF中的Model是MVVM中的Model可以理解,它怎麼又是ViewModel呢。

這裡我們要說一下XPO的PersistentBase類,它是持久化類型必須繼承的類,而它繼承了INotifyPropertyChanged介面,同時XPCollection類型繼承了IBindingList介面,通過這兩個介面我們就可以看出XAF中的Model就已具備了ViewModel的特性。

上面我們提到的XAF中的Model都是持久化類型,如果換成非持久化類型,就更容易理解了,NonPersistentObject也繼承了INotifyPropertyChanged介面,可以說它就是一個存粹的ViewModel,而MVVM中的Model則來自從外部請求的數據。

XAF中的Controller後面會進行單獨的介紹,現在你可以簡單的理解為WinForm中Form的邏輯代碼,只是XAF對其進行了封裝,使其具有可重用性。

其實也不用糾結是什麼模式,MVVM也從MVC演變過來的,不管是MVC還是MVVM,Model都是負責數據及業務邏輯的,所以在我們的日常開發中,應該將業務邏輯寫在Model中。

在XAF中我們一般將邏輯代碼放在Controller或BusinessObject(Model)中,官方也是這樣指導我們的,但我們應該再細分一些,與View相關的邏輯代碼放在Controller中,與業務相關的邏輯代碼放在BusinessObject中(也就是充血模型),這樣可以提高業務邏輯代碼的可重用性。

寫在最後

關於XAF設計模式的分析,只是個人的見解,不一定准確,大家可以在評論區說說你對XAF設計模式的看法。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.遍歷/匹配(foreach/find/match) Stream也是支持類似集合的遍歷和匹配元素的,只是Stream中的元素是以Optional類型存在的。Stream的遍歷、匹配非常簡單。 List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 7, ...
  • 1,JDK和JRE有什麼區別? JRE:Java Runtime Environment( java 運行時環境)。即java程式的運行時環境,包含了 java 虛擬機,java基礎類庫。 JDK:Java Development Kit( java 開發工具包)。即java語言編寫的程式所需的開發 ...
  • 作者:牛牛碼特 鏈接:https://juejin.cn/post/6844903929281511438 背景 緩存是軟體開發中一個非常有用的概念,資料庫緩存更是在項目中必然會遇到的場景。而緩存一致性的保證,更是在面試中被反覆問到,這裡進行一下總結,針對不同的要求,選擇恰到好處的一致性方案。 緩存 ...
  • 責任鏈模式(Chain of Responsibility Pattern)是將鏈中每一個節點看作是一個對象,每個節點處理的請求均不同,且內部自動維護一個下一節點對象。 ...
  • 為什麼會寫這篇文章?主要是因為項目中的代碼大量使用了帶virtual關鍵字的類,想通過本文淺談一下。virtual並沒有什麼超能力可以化腐朽為神奇,它有其存在的理由,但濫用它是一種非常不可取的錯誤行為。本文將帶你一步一步瞭解virtual機制,為你揭開virtual的神秘面紗。 ...
  • CentOS6.x CentOS6中轉用Upstrat代替以前的init.d/rcX.d的線性啟動方式。 一、相關命令 通過initctl help可以查看相關命令 [root@localhost ~]# initctl help Job commands: start Start job. sto ...
  • 背景 2008 年前後的 Midori 項目試圖構建一個以 .NET 為用戶態基礎的操作系統,在這個項目中有很多讓 CLR 以及 C# 的類型系統向著適合系統編程的方向改進的探索,雖然項目最終沒有面世,但是積累了很多的成果。近些年由於 .NET 團隊在高性能和零開銷設施上的需要,從 2017 年開始 ...
  • 自己寫了一種,速度不是很快,但是能夠實現 var findpic = new FindPic(); var rec = findpic.FindPicture(@"C:\Users\zaranet\Desktop\xiao.png", @"C:\Users\zaranet\Desktop\da.pn ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...