WPF仿網易云搭建筆記(5):信息流控制之IOC容器

文章目錄

  • 專欄和Gitee倉庫
  • 前言
  • IOC容器
  • Prism IOC使用
    • 聲明兩個測試的服務類
    • MainWindow IOC 注入[單例]
    • MainWindow里面獲取
    • UserController無法使用
      • 官方解決方案
  • 使用自定義IOC容器,完美解決
    • 既然Prism不好用,直接上微軟的IOC
    • 解決方案
      • App.xaml.cs
      • ViewModel里面直接調用
      • 運行結果
  • 總結

專欄和Gitee倉庫

WPF仿網易云 Gitee倉庫

WPF仿網易云 CSDN博客專欄

前言

上一篇文章中,我們簡單講解了一下父子通訊的邏輯。父子通訊是強綁定邏輯。這里我們將講解消息訂閱通訊的方式。消息訂閱一般用于[頁]和[頁]之間通訊。

IOC容器

IOC容器有許多容器,目前.NET 有兩個最優的依賴注入框架

  • Microsoft.Extensions.DependencyInjection:微軟官方依賴注入框架,聽說在.net core 8.0得到了最強的性能提升
  • Autofac:聽說也是最強的依賴注入框架,性能強,開銷低,功能完善。

Dependency injection in ASP.NET Core

Autofac 官網

深入淺出依賴注入容器——Autofac

.NET Core 依賴注入 Microsoft.Extensions.DependencyInjection

當然,Prism也有自己的IOC容器。

WPF Prims框架詳解

我們這里使用Prism的IOC容器。因為Prism提供了全套的解決方案

Prism IOC使用

我之前使用過微軟的IOC,這里我就不展開說明了。IOC容器的使用都是大差不多的。

Prism.Unity 依賴注入(IOC)的使用

聲明兩個測試的服務類

namespace BlankApp1.Services
{public class TestA_Service{public string Name { get; set; }public TestA_Service() {Name = "小王";}}
}

namespace BlankApp1.Services
{public class TestB_Service{public TestA_Service TestA_Serivce { get; set; }public string Name { get; set; }public TestB_Service(TestA_Service testA_Serivce){TestA_Serivce = testA_Serivce;Name = "小紅";}}
}

MainWindow IOC 注入[單例]

我們目前所有注入的IOC容器實例都是單例注入,生命周期暫時不考慮。

在App.xaml里面注入IOC容器

        /// <summary>/// 這里是IOC容器的注入端口/// </summary>/// <param name="containerRegistry"></param>protected override void RegisterTypes(IContainerRegistry containerRegistry){//這里對TestA_Service進行修改,查看IOC容器是否為單例。containerRegistry.RegisterSingleton<TestA_Service>(sp =>{return new TestA_Service(){Name = "小麗",};});containerRegistry.RegisterSingleton<TestB_Service>();//注入MainWindow,這里注入先后沒有影響containerRegistry.RegisterSingleton<MainWindow>();}

MainWindow里面獲取

public MainWindow(TestB_Service testB_Service)
{InitializeComponent();ViewModel = (MainWindowViewModel)DataContext;ViewModel.MainWindow = this;ViewModel.TestB_Service = testB_Service;
}

結果:獲取成功!
在這里插入圖片描述

UserController無法使用

但是如果我們使用TitleView會怎么樣?

在這里插入圖片描述
在這里插入圖片描述

原因是為什么?因為是因為我們使用的是父子組件構造,但是這樣WPF默認使用的是New 一個新對象,是無參構造。所以會報這個錯誤。

在這里插入圖片描述

官方解決方案

Composing the User Interface Using the Prism Library for WPF

官方的解決比較簡單粗暴,官方認為所有的UserController都是Prism構造的,這里面使用的是Prism的Region方案。所有的信息流都是通過Messager去設置的,如果是這樣設置的話,我們所有的父子通訊都失敗了。而且由于Messager的單一化,導致我們無法復用組件,因為如果存在多個組件ViewA,你不能確認ViewA到底是哪個ViewA,這個和我們的單例注入相違背。

在這里插入圖片描述

使用自定義IOC容器,完美解決

Prism最大的問題,就是他是侵入式框架,你必須按照Prism的解決方案才能解決問題。而且給的方案都比較死。

既然Prism不好用,直接上微軟的IOC

為什么要用微軟的IOC容器,一個是微軟的好用,另一個是ASP.NET Core也都是微軟的IOC。能用一個解決就不學新的。

.NET Core 依賴注入 Microsoft.Extensions.DependencyInjection

解決方案

App.xaml.cs

/// <summary>
/// 全局靜態IOC構造器
/// </summary>
public readonly static ServiceProvider ServiceProvider;/// <summary>
/// 靜態構造,這里以單例舉例
/// </summary>
static App() {IServiceCollection services = new ServiceCollection();services.AddSingleton<TestB_Service>();services.AddSingleton<TestA_Service>(sp =>{return new TestA_Service(){//測試是否被修改。默認小王,修改為小蘭Name = "小蘭"};});ServiceProvider = services.BuildServiceProvider();var res = ServiceProvider.GetService<MainWindowViewModel>();
}

ViewModel里面直接調用

public MainWindowViewModel()
{//直接從構造器里面拿到單例TestB_Service = App.ServiceProvider.GetService<TestB_Service>();
}

運行結果

在這里插入圖片描述
其實通過Service可以進行間接通訊。這里我就不展開說明了。

總結

因為父子組件開發的特點,所有的UserController都可能存在多個,所以UserController是不能進行IOC的。因為IOC會有兩個源,一個是Xaml實例化,另一個是IOC容器。還有一個問題是Xaml語法是不能進行IOC的,而且由于生命周期的原因,IOC實例化之前會報錯。所以直接放棄UserController的IOC注入。

但是Services服務類可以進行IOC注入,比如數據庫操作,網絡通訊,業務邏輯(比如用戶登錄)。

我們目前已經完美解決了WPF 的信息流控制。通過WPF的組件化開發,消息訂閱,IOC容器。大大降低了WPF項目的耦合,讓我們可以將所有復雜的WPF 程序進行無限拆分。

DataContext強綁定,依賴屬性暴露
父子組件通訊,Message消息訂閱
IOC構造
IOC取出
View
ViewModel
ViewA
Services
IOC容器

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

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

相關文章

網絡測試工具:tcping-測試端口連接

網絡測試工具&#xff1a;tcping-測試端口連接 平常使用的ping&#xff0c;是通過icmp協議去測試網絡連通性的&#xff0c;tcping是通過tcp三次握手測試端口的連通性。總的來說&#xff0c;ping測試的是L3的連通性&#xff0c;tcping測試的是L4的連通性。 tcping工具下載 htt…

10.RIP路由信息協議

10.RIP 網段經常產生變化的話&#xff0c;建議使用動態路由協議&#xff0c;當網段發生變化的時候會自動通告給其他路由器 它不看鏈路的帶寬&#xff0c;只看鏈路中的跳數&#xff0c;只要是跳數多的&#xff0c;不管帶寬有多大&#xff0c;它就認為是不好的 RIP跳數有限 …

java中LinkedList和List繼承有什么區別?

在Java中&#xff0c;LinkedList 和 List 是兩個不同的概念。List 是一個接口&#xff0c;而 LinkedList 是實現了 List 接口的一個具體類。 List 接口&#xff1a; List 是Java集合框架中的一個接口&#xff0c;它表示有序的集合&#xff0c;允許重復元素。List 接口繼承自 C…

TYPE-C接口設備實現DRP+OTG功能芯片

隨著USB-C接口的普及&#xff0c;歐盟的法律法規強制越來越多的設備開始采用這種接口。由于 USB-C接口的高效性和便攜性&#xff0c;使各種設備之間的連接和數據傳輸變得非常方便快捷&#xff0c;它們不僅提供了強大的功能&#xff0c;還為我們的日常生活和工作帶來了極大的便利…

青少年CTF-Misc(持續更新中)

FLAG&#xff1a;當覺得自己很菜的時候&#xff0c;就靜下心來學習 專研方向:Web安全&#xff0c;CTF 每日emo&#xff1a;聽一千遍反方向的鐘&#xff0c;我們能回到過去嗎&#xff1f; 1.StegoTXT&#xff1a; 解壓縮文件。發現字母中存在覆蓋。使用0寬隱寫在線解密得到flag…

YOLOv8改進 | 2023主干篇 | EfficientViT替換Backbone(高效的視覺變換網絡)

一、本文介紹 本文給大家帶來的改進機制是EfficientViT&#xff08;高效的視覺變換網絡&#xff09;&#xff0c;EfficientViT的核心是一種輕量級的多尺度線性注意力模塊&#xff0c;能夠在只使用硬件高效操作的情況下實現全局感受野和多尺度學習。本文帶來是2023年的最新版本…

?sqlite3 --- SQLite 數據庫 DB-API 2.0 接口模塊?

源代碼&#xff1a; Lib/sqlite3/ SQLite 是一個C語言庫&#xff0c;它可以提供一種輕量級的基于磁盤的數據庫&#xff0c;這種數據庫不需要獨立的服務器進程&#xff0c;也允許需要使用一種非標準的 SQL 查詢語言來訪問它。一些應用程序可以使用 SQLite 作為內部數據存儲。可…

量子算力引領未來!玻色量子出席第二屆CCF量子計算大會

?8月19日至20日&#xff0c;中國計算機學會&#xff08;CCF&#xff09;主辦的第二屆CCF量子計算大會暨中國量子計算峰會&#xff08;CQCC 2023&#xff09;在中國合肥成功舉辦。本屆大會以“量超融合&#xff0c;大國算力”為主題&#xff0c;設有量子計算軟件、硬件、應用生…

【C++類模板對象做函數參數】

類模板實例化出的對象&#xff0c;向函數傳參的方式 一共有三種傳入方式&#xff1a; 指定傳入的類型 — 直接顯示對象的數據類型參數模板化 — 將對象中的參數變為模板進行傳遞整個類模板化 — 將這個對象類型 模板化進行傳遞 總結&#xff1a;比較廣泛使用的是第一種&…

計算機網絡(三)

&#xff08;十一&#xff09;路由算法 A、路由算法分類 動態路由和靜態路由 靜態路由&#xff1a;人工配制&#xff0c;路由信息更新慢&#xff0c;優先級高。這種在實際網絡中要投入成本大&#xff0c;準確但是可行性弱。 動態路由&#xff1a;路由更新快&#xff0c;自動…

12/11

完善對話框&#xff0c;點擊登錄對話框&#xff0c;如果賬號和密碼匹配&#xff0c;則彈出信息對話框&#xff0c;給出提示”登錄成功“&#xff0c;提供一個Ok按鈕&#xff0c;用戶點擊Ok后&#xff0c;關閉登錄界面&#xff0c;跳轉到其他界面 如果賬號和密碼不匹配&#xf…

css的Grid布局

1.簡單布局 .grid { display: grid; grid-template-columns: 1fr 2fr 1fr; 布局樣式 column-gap: 24px; 列間距 row-gap: 24px; 行間距 } 2.排列布局 center垂直方向居中對其 end靠下對齊 3.水平方向對齊 center居中 end靠右對齊 space-between兩段對齊 4.對…

【SpringBoot】Spring Boot 單體應用升級 Spring Cloud 微服務

Spring Cloud 是在 Spring Boot 之上構建的一套微服務生態體系&#xff0c;包括服務發現、配置中心、限流降級、分布式事務、異步消息等&#xff0c;因此通過增加依賴、注解等簡單的四步即可完成 Spring Boot 應用到 Spring Cloud 升級。 Spring Boot 應用升級為 Spring Cloud…

插入排序和希爾排序

目錄 前言 一.插入排序 1.思想 2.實現 3.特點 二,希爾排序 1.思想 2,實現 3.特點 前言 排序算法是計算機科學中的基礎工具之一&#xff0c;對于數據處理和算法設計有著深遠的影響。了解不同排序算法的特性和適用場景&#xff0c;能夠幫助程序員在特定情況下選擇最合適的…

如何使用玻璃材質制作3D鉆石模型

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xf…

Spark與PySpark(1.概述、框架、模塊)

目錄 1.Spark 概念 2. Hadoop和Spark的對比 3. Spark特點 3.1 運行速度快 3.2 簡單易用 3.3 通用性強 3.4 可以允許運行在很多地方 4. Spark框架模塊 4.1 Spark Core 4.2 SparkSQL 4.3 SparkStreaming 4.4 MLlib 4.5 GraphX 5. Spark的運行模式 5.1 本地模式(單機) Local運行模…

初識Vue 解決vue在啟動時生成的提示

讓我為大家簡單介紹一下吧&#xff01; Vue是一套用于構建用戶界面的漸進式javaScript框架 當我們引入vue.js后 <script src"../js/vue.js"></script>我們發現&#xff0c;當我們打開網頁時&#xff0c;控制臺會出現以下內容 那我們該怎么解決呢&…

【設計模式--結構型--組合模式】

設計模式--結構型--組合模式 組合模式定義結構案例組合模式的分類優點使用場景 組合模式 定義 又稱部分整體模式&#xff0c;是用于把一組相似的對象當作一個單一的對象。組合模式依據樹型結構來組合對象&#xff0c;用來表示部分以及整體層次&#xff0c;這種類型的設計模式…

新增模板中心和系統設置模塊,支持飛書平臺對接,DataEase開源數據可視化分析平臺v2.1.0發布

這一版本的功能升級包括&#xff1a;新增模板中心&#xff0c;用戶可以通過模板中心的模板快速創建儀表板和數據大屏&#xff1b;新增“系統設置”功能模塊&#xff0c;該模塊包含系統參數、認證設置、嵌入式管理、平臺對接四個子模塊。在“系統參數”子模塊中&#xff0c;用戶…

代碼上傳的gitee平臺

1.首先我們訪問工作臺 - Gitee.com進行注冊和登錄 2.我們創建一個倉庫&#xff1a; 3.在本地創建我們的項目 在這文件夾里面我們打開git bush,執行 一下操作&#xff1a; git init &#xff1a;初始化倉庫 git status&#xff1a;檢查狀態 git add . &#xff1a;將當前文件…