WPF魔法:輕鬆實現依賴註入與控制反轉提升代碼優雅性與可維護性

来源:https://www.cnblogs.com/hanbing81868164/p/18002514
-Advertisement-
Play Games

概述:在WPF中實現依賴註入和控制反轉,通過定義介面、實現類,配置容器,實現組件解耦、提高可維護性。 什麼是依賴註入和控制反轉? 依賴註入(Dependency Injection,DI): 是一種設計模式,旨在減少組件之間的耦合度。通過依賴註入,對象不再自行創建或查找依賴對象,而是通過外部註入的方 ...


 

概述:在WPF中實現依賴註入和控制反轉,通過定義介面、實現類,配置容器,實現組件解耦、提高可維護性。

什麼是依賴註入和控制反轉?

依賴註入(Dependency Injection,DI): 是一種設計模式,旨在減少組件之間的耦合度。通過依賴註入,對象不再自行創建或查找依賴對象,而是通過外部註入的方式提供所需的依賴。

控制反轉(Inversion of Control,IoC): 是一種軟體設計原則,它顛覆了傳統的控制流程。在IoC中,不再由調用者控制調用,而是由外部容器負責控制和管理對象的創建和依賴關係。

優點:

  • 鬆散耦合: 通過依賴註入,組件之間的依賴關係降低,提高了代碼的靈活性和可維護性。
  • 易測試: 可以更容易地進行單元測試,因為依賴可以被替代或模擬。
  • 可維護性: 代碼更容易理解和修改,便於後續的擴展和維護。

在WPF中實現依賴註入的方法、步驟、實例:

1.創建介面和實現類:定義一個介面和一個實現類。

// 示例介面
public interface IDataService
{
    string GetData();
}

// 示例實現類
public class DataService : IDataService
{
    public string GetData()
    {
        return "Hello from DataService!";
    }
}

2.在App.xaml.cs中配置依賴註入容器:使用內置的System.Windows.Markup.XamlLoader或第三方容器(如Autofac)配置容器。

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        // 使用內置XamlLoader實現依賴註入
        var container = new ContainerBuilder();
        container.RegisterType<DataService>().As<IDataService>();

        // 註入依賴
        var mainWindow = XamlLoader.Load<MainWindow>(container.Build());
        mainWindow.Show();
    }
}

3.在視窗中使用註入的依賴:通過構造函數或屬性註入依賴。

public partial class MainWindow : Window
{
    private readonly IDataService _dataService;

    // 通過構造函數註入依賴
    public MainWindow(IDataService dataService)
    {
        InitializeComponent();
        _dataService = dataService;
        Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        // 使用註入的依賴
        MessageBox.Show(_dataService.GetData());
    }
}

通過這樣的實現,我們在WPF應用中實現了依賴註入和控制反轉,提高了代碼的可測試性和可維護性。這種模式使得將來的修改和擴展更為簡便。

 


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

-Advertisement-
Play Games
更多相關文章
  • 折騰Docker 有幾天了,整別的都沒這個糟心。目前已經順利部署運行起來了。順便給大家分享下處理在Windows上使用.NET部署到Docker的相關問題解決方法。 1. Docker無法安裝問題 (下圖是網上找了個類似的安裝失敗截圖,頁面大致一樣,就是提示內容是 Docker Desktop 只能 ...
  • YOLOv5 是革命性的 "單階段"對象檢測模型的第五次迭代,旨在實時提供高速、高精度的結果,是世界上最受歡迎的視覺人工智慧模型,代表了Ultralytics對未來視覺人工智慧方法的開源研究,融合了數千小時研發中積累的經驗教訓和最佳實踐。同時官方發佈的模型已經支持 OpenVINO™ 部署工具加速模... ...
  • C#獲得項目最後編譯時間 效果 具體格式可以自定義 核心代碼 string GetCompileVersion() { string OriginVersion = "" + System.IO.File.GetLastWriteTime(this.GetType().Assembly.Locati ...
  • 在Web開發的時候,編寫css樣式的時候通常是統一寫在.css樣式文件中。在WPF中也可以使用這樣的思想。 樣式引用: 1.新建一個項目用於統一存放樣式WPF.UI 添加一個資源字典Button.xaml或者CheckBox.xaml等等.... <ResourceDictionary xmlns= ...
  • Popup 是一個用於顯示臨時性內容的控制項,它可以在應用程式的其他內容之上顯示一個彈出視窗。它通常用於實現下拉菜單、工具提示、通知消息等功能。 主要屬性為: Child:獲取或設置 Popup控制項的內容。IsOpen:獲取或設置一個值,該值指示Popup 是否可見Placement:獲取或設置 Po ...
  • ModuleAttribute(按需延遲載入) ModuleAttribute 是 Prism 框架中用於標識模塊的屬性。通過使用 ModuleAttribute,可以將模塊與特定的模塊目錄進行關聯,從而使 Prism 應用程式能夠動態載入和初始化模塊。 在使用 WPF ModuleAttribut ...
  • 什麼是Prism: 1.WPF Prism是一個用於構建模塊化、可擴展和可重用的WPF應用程式的框架。它基於MVVM模式,提供了一種簡單且靈活的方式來管理複雜的WPF應用程式。 2.Prism框架提供了一些核心概念,包括模塊化開發、依賴註入、命令模式、導航和事件聚合等。它還提供了一些實用工具和類來簡 ...
  • MVVM-命令模式的實現與應用 本文同時為b站WPF課程的筆記,相關示例代碼 綁定 這個其實前面已經講過一部分 使用{Binding}設置數據綁定,將控制項的屬性綁定到 ViewModel 的相應屬性。 比如說需要註意,在xaml中綁定的不再是UserName和Password了,而是loginMod ...
一周排行
    -Advertisement-
    Play Games
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...