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));