快速上手Prism WPF 工程

1、Prism 介紹

  • ?定位?:
    Prism 是 ?微軟推出的框架,專為構建 ?模塊化、可維護的復合式應用程序? 設計,主要支持 WPF、Xamarin.Forms、UWP 等平臺。
  • ?核心功能?:
    • ?模塊化開發?:將應用拆分為獨立模塊,按需加載。
    • ?導航管理?:處理頁面導航和參數傳遞。
    • ?事件聚合?:通過事件總線實現松耦合的組件通信。
    • ?依賴注入集成?:支持多種 DI 容器(如 Unity、DryIoc、Autofac)。
  • ?與 DI 容器的關系?:
    Prism ?不直接提供 DI 容器,但提供接口(IContainerRegistry?和?IContainerProvider)來集成第三方容器(如 Unity 或 DryIoc)。

2、Prims 模版擴展安裝

在Visual Studio 2022 管理擴展中加載

3、Prism - Unity 和 DryIoc選擇

?Unity?

  • ?定位?:
    Unity 是 ?微軟開發的依賴注入容器,屬于 Enterprise Library 的一部分,功能全面但較為重量級。
  • ?核心功能?:
    • ?依賴注入?:支持構造函數注入、屬性注入、方法注入。
    • ?生命周期管理?:單例、瞬態、作用域等生命周期控制。
    • ?擴展性?:支持自定義擴展(如攔截器、策略)。
  • ?性能?:
    早期版本性能較低,但最新版本(Unity 5+)已優化。
  • ?適用場景?:
    適合企業級應用,尤其是需要復雜依賴管理和擴展性的項目。

DryIoc?

  • ?定位?:
    DryIoc 是 ?輕量級、高性能的依賴注入容器,以極快的解析速度著稱。
  • ?核心功能?:
    • ?極速解析?:通過優化代碼生成和緩存實現高性能。
    • ?簡潔 API?:配置簡單,學習成本低。
    • ?零依賴?:無外部庫依賴,適合輕量化項目。
    • ?高級功能?:支持條件注冊、裝飾器、元數據等。
  • ?性能?:
    在基準測試中通常比 Unity 快 2-10 倍。
  • ?適用場景?:
    適合對性能敏感的應用(如游戲、高頻服務)或需要輕量級 DI 容器的場景。

4、創建Prism工程

文件>新建項目

5、工程目錄結構

  • Prism 完整應用程序?- 此項目模板創建一個 Prism 應用程序,其中包含一個 Shell 項目、一個模塊項目、一個核心項目、一個服務項目和一個單元測試項目。

6、核心對象介紹

??????BindableBase? 數據與行為綁定對象

簡介

BindableBase 是 Prism 中實現 數據綁定通知 的核心基類,繼承自 INotifyPropertyChanged 接口。它簡化了屬性變更通知的觸發邏輯,確保 UI 能夠自動響應數據變化。

作用與特性
自動觸發通知:通過 SetProperty 方法設置屬性值,自動觸發 PropertyChanged 事件。
減少樣板代碼:避免手動編寫 if (value != field) { ... } 和事件觸發邏輯。
支持派生類:ViewModel 通常繼承 BindableBase,直接使用其功能。
關鍵方法
SetProperty(ref T field, T value):基礎屬性設置。
SetProperty(ref T field, T value, Action onChanged):設置屬性并執行回調。
RaisePropertyChanged(string propertyName):手動觸發指定屬性的通知。

? ?IContainerRegistry?IContainerProvider

  • IContainerRegistry:用于注冊服務(接口與實現的映射)。
  • IContainerProvider:用于解析(獲取)已注冊的服務實例。
     public MainViewModel(IContainerProvider containerProvider){var service = containerProvider.Resolve<IMessageService>();}
    

注冊方式


# 接口綁定實現類:
containerRegistry.Register<IMessageService, MessageService>();
#直接注冊具體類(無需接口):
containerRegistry.Register<MessageService>();#單例(Singleton):全局唯一實例。
containerRegistry.RegisterSingleton<IMessageService, MessageService>();
#瞬態(Transient):每次解析創建新實例。
containerRegistry.Register<IMessageService, MessageService>();#實例注冊:直接注入已有實例。
var logger = new FileLogger();
containerRegistry.RegisterInstance<ILogger>(logger);#同一個接口多個實現,注冊時加別名containerRegistry.Register<IMessageService, MessageService>("msg");
containerRegistry.Register<IMessageService, EmailMessageService>("emailMsg");

注入方式

#1、構造函數注入  **推薦
private readonly ILogger _logger;
private readonly IEventAggregator _eventAggregator;public MessageService(IEventAggregator eventAggregator, ILogger logger)#2、屬性注入[Dependency]
public ILogger Logger { get; set; }

IEventAggregator

在Prism框架中,事件總線(Event Aggregator)?是實現松耦合跨組件通信的核心機制。它通過發布-訂閱模式(Pub-Sub)讓不同模塊、視圖或服務之間無需直接引用即可傳遞消息,尤其適用于模塊化架構和MVVM模式。

核心組件 直接依賴注入

# 使用流程# 定義事件 
// 有參事件
public class NoMicDeviceEvent : PubSubEvent<bool> { }
// 無參事件
public class AppExitEvent : PubSubEvent{ }# 發布事件// 發布有參事件
_eventAggregator.GetEvent<NoMicDeviceEvent>().Publish(true);// 發布無參事件
_eventAggregator.GetEvent<AppExitEvent>().Publish();# 訂閱事件// 訂閱事件(自動強引用,需手動取消訂閱)
_eventAggregator.GetEvent<NoMicDeviceEvent>().Subscribe((bo) => HandleNoMicDeviceEvent(bo));// 處理事件的回調方法
private void HandleNoMicDeviceEvent(bool isNoMic)
{//處理邏輯
}# 訂閱參數
.Subscribe(Action<TPayload> action,                     // 回調方法ThreadOption.UIThread,                // ThreadOption threadOption 在UI線程執行keepSubscriberReferenceAlive: false,  // 弱引用Predicate<TPayload> filter:           // 過濾數據
#參數#回調方法
#執行具體的業務邏輯(如更新數據庫、刷新UI)。#filter
#過濾無關事件(如只處理特定用戶或狀態的數據)。#keepSubscriberReferenceAlive
#控制訂閱者生命周期(View/ViewModel用弱引用,服務層可強引用)。#ThreadOption
#PublisherThread:在發布事件的線程執行(默認)。
#UIThread:在UI線程執行(安全更新界面)。
#BackgroundThread:在線程池后臺線程執行(避免阻塞UI)
#解決跨線程問題(UI操作必須在UI線程,耗時操作在后臺線程)。# 卸載事件
_eventAggregator.GetEvent<NoMicDeviceEvent>().Unsubscribe((bo) => HandleNoMicDeviceEvent(bo));

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78778.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

React 單一職責原則:優化組件設計與提高可維護性

單一職責原則&#xff08;SRP&#xff09; 在 React 中&#xff0c;組件是構建 UI 的核心單位&#xff0c;而良好的組件設計是保證應用質量和可維護性的關鍵。單一職責原則是一種設計原則&#xff0c;也適用于 React 組件的開發。它強調每個組件應該只關注一個職責&#xff0c…

css網格布局Grid

一、網格布局適應場景 當涉及到的布局是二維布局&#xff08;元素不止一行或者一列&#xff09;且比較復雜的時候&#xff0c;可以用網格布局&#xff0c;看下面的一個例子&#xff1a; 上圖上一個四行三列的網格&#xff0c;布局相對比較復雜。如果你用別的布局方案&#xff…

利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件

以下是一個 Python 腳本&#xff0c;用于生成 Xilinx IP ROM 的.coe 格式初始化文件&#xff0c;假設ROM 深度為 1024&#xff0c;數據位寬為 32bit&#xff0c;使用隨機的 32 位無符號數進行初始化&#xff1a; import random# 定義ROM的深度和數據位寬 rom_depth 1024 data…

8.2 段落格式

在word里&#xff0c;段落格式包括首行縮進、行間距、段前、段后等。LaTex同樣支持這些功能。 段落間距 全局設置 段落間距用setlength命令來指定。如以下代碼 \documentclass{article} \usepackage{ctex} \begin{document}\setlength{\parskip}{11em plus 1em minus 1em}\p…

OpenVLA-OFT

TL;DR 2025 年斯坦福提出的 OpenVLA 工作的續作 OpenVLA-OFT&#xff0c;優化 VLA 能夠有效適應新的機器人平臺和任務&#xff0c;優化的技術主要有并行解碼、動作塊處理、連續動作、L1 回歸和&#xff08;可選的&#xff09;FiLM 語言調節 Paper name Fine-Tuning Vision-La…

SpringBoot 接口國際化i18n 多語言返回 中英文切換 全球化 語言切換

介紹 Spring Boot通過MessageSource接口來實現國際化&#xff0c;它可以加載不同的消息資源文件&#xff0c;通常是.properties格式。通過定義不同的語言文件&#xff08;例如&#xff1a;messages_en.properties、messages_zh.properties等&#xff09;&#xff0c;可以根據用…

一個crackme例子

文件下載地址&#xff1a;https://download.csdn.net/download/m0_37567738/90713354 將cipher.txt文件內容解密后&#xff1a; 恭喜你解出了這一關&#xff0c;flag為 zjwa{36_23121136a28d0d15} 好了現在告訴你最后一層的獲取方式&#xff0c; 在系統內找到 手機鏡像的 ra…

賬戶解封無望?3步高效申訴取回亞馬遜凍結資金

近年來&#xff0c;隨著全球跨境電商市場的飛速擴張&#xff0c;亞馬遜&#xff08;Amazon&#xff09;作為其中的巨頭&#xff0c;持續強化其平臺治理力度。然而&#xff0c;隨之而來的是賣家賬戶因各種原因被凍結、關閉的事件頻頻發生。根據Marketplace Pulse發布的2024年第一…

【C++ Qt】快速上手 顯?類控件(Label、LCDNumber、ProcessBar、CalendarWidget)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本文圍繞Qt中常用的顯示類控件展開&#xff0c;重點講解了 QLabel&#xff08;文本/圖片顯示&#xff09;、QLCDNumber&#xff08;數字顯示&#xff0…

從困局到破局的AI+數據分析

從困局到破局的AI數據分析 困局&#xff1a;數據分析的四道高墻破局&#xff1a;AI賦能全流程數據分析遠見&#xff1a;AI數據分析的革命性意義 數據是新時代的石油&#xff0c;人工智能是煉油廠。當兩者強強聯合&#xff0c;一場數據分析的革命正悄然發生。 多少次你面對Excel…

IGH 匯川SV660N調試

EoE 目前的方式是將eoe 關閉, 這需要重新配置編譯ec_master sudo ./configure --disable-8139too --enable-generic --enable-r8169 --disable-eoe --enable-coe[426163.348589] EtherCAT 0: Master thread exited. [426163.348592] EtherCAT 0: Stopping EoE thread. [426163.…

Java基礎361問第16問——枚舉為什么導致空指針?

我們看一段代碼 public enum Color {RED, BLUE, YELLOW;public static Color parse(String color) {return null;} }public static void main() {Color color Color.parse("");// 極具迷惑性&#xff0c;大家日常開發肯定這么寫過switch (color) {case RED:break;c…

10.Excel:快速定位目標值

一 批量刪除 1.如何使用 快捷鍵 CTRLG 補充&#xff1a;直接選擇定位條件。 2.作用 1.批量刪除工作表中的圖片 補充&#xff1a;無法通過框選的方式選中這些圖片進行刪除。 這樣只框選了表格&#xff0c;無法框選圖片。因為圖片在excel中被認為是一個對象&#xff0c;對象無法通…

快樂數(雙指針解法)

題目鏈接202. 快樂數 - 力扣&#xff08;LeetCode&#xff09; 題目拆解 1 取一個正整數每一位的平方和為&#xff0c;如果為1那么直接可以判定為快樂數&#xff0c;如果不為1&#xff0c;就重復這個過程&#xff0c;直到出現1 2 實際上&#xff0c;這道題只有兩種情況&#xf…

進程控制的學習

進程控制&#xff08;Process Control&#xff09;是指操作系統對進程的創建、執行、暫停、恢復、終止等一系列狀態變化進行管理和協調的過程。 簡單說&#xff0c;就是系統讓各個程序能有序地運行&#xff0c;合理地使用CPU和資源&#xff0c;而不會互相沖突或者出錯。 主要包…

818協議知識筆記

一、概念 Fibre CHannel-Audio Vedio standard;FC-AV FC-FS:Fibre channel framing and signaling interface; FC-PI:fibre channel physical interfaces 二、術語 VGA,SVGA,XGA,WXGA,SXGA,SXGA,WSXGA,UXGA,1440P; ICD:interface control document接口控制文檔 CRC對幀頭和數據…

AI大模型學習十二:?嘗鮮ubuntu 25.04 桌面版私有化sealos cloud + devbox+minio對象存儲測試和漫長修改之路

一、說明 前面已經安裝完成&#xff0c;這里我們測試對象存儲 AI大模型學習十一&#xff1a;?嘗鮮ubuntu 25.04 桌面版私有化sealos cloud devboxminio&#xff0c;實戰運行成功-CSDN博客https://blog.csdn.net/jiangkp/article/details/147424823?spm1011.2415.3001.5331 二…

SpringBoot的自動掃描特性-筆記

1.Spring Boot 的自動掃描特性介紹 Spring Boot 的自動掃描&#xff08;Component Scanning&#xff09;是其核心特性之一。通過注解SpringBootApplication 簡化了 Bean 的管理&#xff0c;允許框架自動發現并注冊帶有特定注解的類為 Spring 容器中的 Bean&#xff08;特定注解…

基于nodeJS代碼的通過爬蟲方式實現tiktok發布視頻(2025年4月)

1、將真實的tiktokstudio平臺的cookie填到代碼里的cookie變量里,修改python代碼里的ticket,ts, privateKey,以及videoPath,timing等變量的值,最后運行python腳本即可; 2、運行之前根據import提示安裝一些常見依賴,比如node-fetch等; 3、運行時候可能系統需要科學上網…

數據一致性問題剖析與實踐(四)——競態條件競爭導致的一致性問題

一、前言 之前我們討論了幾種場景的一致性問題 冗余數據存儲中的一致性問題分布式共識中的一致性問題單機事務中的一致性問題分布式事務中的一致性問題 本文將圍繞競態條件競爭中的一致性問題展開討論分析。 二、 問題定義 競態條件&#xff08;Race Condition&#xff09…