国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入理解WPF中的依賴注入和控制反轉(zhuǎn)

這篇具有很好參考價(jià)值的文章主要介紹了深入理解WPF中的依賴注入和控制反轉(zhuǎn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在WPF開發(fā)中,依賴注入(Dependency Injection)和控制反轉(zhuǎn)(Inversion of Control)是程序解耦的關(guān)鍵,在當(dāng)今軟件工程中占有舉足輕重的地位,兩者之間有著密不可分的聯(lián)系。今天就以一個(gè)簡單的小例子,簡述如何在WPF中實(shí)現(xiàn)依賴注入和控制反轉(zhuǎn),僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正。

深入理解WPF中的依賴注入和控制反轉(zhuǎn)

?

什么是依賴注入和控制反轉(zhuǎn)?

?

依賴注入又稱為依賴項(xiàng)注入,那什么是依賴項(xiàng)呢?比如在一個(gè)類A中,實(shí)現(xiàn)某中功能,而此功能是另外一個(gè)類B實(shí)現(xiàn)的,那就說明A依賴B,B就是A的依賴項(xiàng)?;蛘呤橇硪粋€(gè)對(duì)象A所依賴的對(duì)象B。示例如下:

namespace DemoIoc
{
    public class MessageWriter
    {
        public void Print(string message)
        {
            Console.WriteLine($"MessageWriter.Write(message: \"{message}\")");
        }
    }

    public class Worker : BackgroundService
    {
        private readonly MessageWriter writer = new();

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                writer.Print($"Worker running at: {DateTimeOffset.Now}");
                await Task.Delay(1_000, stoppingToken);
            }
        }
    }
}

注意:在上述示例中,Worker類依賴于MessageWriter類,所以MessageWriter就是Worker的依賴項(xiàng)。 硬編碼的依賴項(xiàng)(如前面的示例)會(huì)產(chǎn)生問題,應(yīng)避免使用。

強(qiáng)依賴關(guān)系具有以下幾個(gè)問題:

  • 如果要用不同的實(shí)現(xiàn)替換?MessageWriter,必須修改?Worker?類。
  • 如果?MessageWriter?具有依賴項(xiàng),則必須由?Worker 類對(duì)其進(jìn)行配置,且很難進(jìn)行初始化。
  • 這種實(shí)現(xiàn)很難進(jìn)行單元測(cè)試。

那如何解決上述依賴關(guān)系所造成的弊端呢?答案就是依賴項(xiàng)注入??赏ㄟ^如下幾個(gè)步驟實(shí)現(xiàn):

  • 使用接口或基類將依賴關(guān)系實(shí)現(xiàn)抽象化。
  • 在服務(wù)容器中注冊(cè)依賴關(guān)系。
  • 將服務(wù)注入到使用它的類的構(gòu)造函數(shù)中。

?.NET 提供了一個(gè)內(nèi)置的服務(wù)容器?IServiceProvider。 服務(wù)通常在應(yīng)用啟動(dòng)時(shí)注冊(cè),并追加到?IServiceCollection。 添加所有服務(wù)后,可以使用?BuildServiceProvider?創(chuàng)建服務(wù)容器。?框架負(fù)責(zé)創(chuàng)建依賴關(guān)系的實(shí)例,并在不再需要時(shí)將其釋放。

簡單一句話說:依賴注入(DI)將所依賴的對(duì)象參數(shù)化,接口化,并且將依賴對(duì)象的創(chuàng)建和釋放剝離出來,這樣就做到了解耦,并且實(shí)現(xiàn)了控制反轉(zhuǎn)(IoC)。

控制反轉(zhuǎn)(IoC)具有如下兩個(gè)特點(diǎn):

  • 高等級(jí)的代碼不能依賴低等級(jí)的代碼;
  • 抽象接口不能依賴具體實(shí)現(xiàn);

控制反轉(zhuǎn)解決代碼的強(qiáng)耦合,增加了代碼的可擴(kuò)展性。依賴注入將依賴具體實(shí)現(xiàn)類和控制實(shí)現(xiàn)類的創(chuàng)建和釋放,變成了依賴接口或抽象類,不再控制接口的創(chuàng)建和釋放。兩者之間相輔相成,互相成就。

深入理解WPF中的依賴注入和控制反轉(zhuǎn)

?

WPF中實(shí)現(xiàn)依賴注入的步驟

?

1. 安裝DI庫

?

首先創(chuàng)建一個(gè)WPF應(yīng)用程序,然后在Nuget包管理器中安裝微軟提供的依賴注入庫【Microsoft.Extensions.DependencyInjection】,如下所示:

深入理解WPF中的依賴注入和控制反轉(zhuǎn)

?

2. 創(chuàng)建接口和實(shí)現(xiàn)類

?

創(chuàng)建測(cè)試用的接口ITextService和實(shí)現(xiàn)類TextService,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoIoc
{
    public interface ITextService
    {
       public string GetText();
    }

    public class TextService : ITextService
    {
        public string GetText()
        {
            return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
        }
    }
}

?

3. 接口注入

?

在需要調(diào)用的地方(如:MainWindow)進(jìn)行ITextService接口注入,如下所示:

namespace DemoIoc
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private ITextService textService;

        public MainWindow(ITextService textService)
        {
            this.textService = textService;
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.txtCurrentTime.Text = textService.GetText();
        }
    }
}

注意:以上可以看出MainWindow依賴ITextService接口,而不依賴于接口的實(shí)現(xiàn)。這樣就實(shí)現(xiàn)了依賴注入。

?

4. 配置容器

?

在啟動(dòng)程序App.xaml.cs中,添加當(dāng)前對(duì)象成員,和服務(wù)提供對(duì)象,并在實(shí)例化服務(wù)對(duì)象的時(shí)候一次性注冊(cè),以便在后續(xù)需要的時(shí)候進(jìn)行獲取。如下所示:

namespace DemoIoc
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        /// <summary>
        /// 獲取當(dāng)前 App 實(shí)例
        /// </summary>
        public new static App Current => (App)Application.Current;
        /// <summary>
        /// 獲取存放應(yīng)用服務(wù)的容器
        /// </summary>
        public IServiceProvider ServiceProvider { get; }

        public App()
        {
            ServiceProvider = ConfigureServices();
        }

        /// <summary>
        /// 配置應(yīng)用的服務(wù)
        /// </summary>
        private static IServiceProvider ConfigureServices()
        {
            var serviceCollection = new ServiceCollection()
                .AddSingleton<ITextService,TextService>()
                .AddSingleton<MainWindow>();
                
            return serviceCollection.BuildServiceProvider();
        }

        protected override void OnStartup(StartupEventArgs e)
        {
            var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
            mainWindow.Show();
        }
    }
}

注意:在此示例中,MainWindow通過服務(wù)注冊(cè)的方式進(jìn)行實(shí)例化,所以需要?jiǎng)h除默認(rèn)的App.xaml中StartUri屬性設(shè)置,否則將提示默認(rèn)構(gòu)造函數(shù)不存在。

?

示例測(cè)試

?

經(jīng)過上述步驟,就實(shí)現(xiàn)了WPF中依賴注入和控制反轉(zhuǎn),測(cè)試結(jié)果如下:

深入理解WPF中的依賴注入和控制反轉(zhuǎn)

說明:正常輸出,則表示依賴注入成功。

?

參考文檔

?

1. .Net依賴項(xiàng)注入:https://learn.microsoft.com/zh-cn/dotnet/core/extensions/dependency-injection

?

以上就是依賴注入和控制反轉(zhuǎn)的全部內(nèi)容,希望可以拋磚引玉,一起學(xué)習(xí),共同進(jìn)步。文章來源地址http://www.zghlxwxcb.cn/news/detail-741814.html

到了這里,關(guān)于深入理解WPF中的依賴注入和控制反轉(zhuǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • PHP依賴注入 與 控制反轉(zhuǎn)詳解

    PHP依賴注入 與 控制反轉(zhuǎn)詳解

    ? 依賴注入 是一種設(shè)計(jì)模式,用于解耦組件之間的依賴關(guān)系。 它的主要思想是通過 將依賴的對(duì)象傳遞給調(diào)用方 ,而 不是由調(diào)用方自己創(chuàng)建或管理依賴的對(duì)象 。這種方式使得組件的依賴關(guān)系更加靈活,易于維護(hù)和測(cè)試。 控制反轉(zhuǎn) 是一個(gè)更廣泛的概念,它與依賴注入緊密相

    2024年02月06日
    瀏覽(23)
  • 使用 Spring 實(shí)現(xiàn)控制反轉(zhuǎn)和依賴注入

    在本文中,我們將介紹 IoC (控制反轉(zhuǎn))和 DI (依賴注入)的概念,以及如何在 Spring 框架中實(shí)現(xiàn)它們。 控制反轉(zhuǎn)是軟件工程中的一個(gè)原則,它將對(duì)象或程序的某些部分的控制權(quán)轉(zhuǎn)移給容器或框架。我們最常在面向?qū)ο缶幊痰纳舷挛闹惺褂盟?與傳統(tǒng)編程相比,傳統(tǒng)編程中我

    2024年02月13日
    瀏覽(18)
  • Spring-2-深入理解Spring 注解依賴注入(DI):簡化Java應(yīng)用程序開發(fā)

    Spring-2-深入理解Spring 注解依賴注入(DI):簡化Java應(yīng)用程序開發(fā)

    ? 掌握純注解開發(fā)依賴注入(DI)模式 學(xué)習(xí)使用純注解進(jìn)行第三方Bean注入 問題導(dǎo)入 思考:如何使用注解方式將Bean對(duì)象注入到類中 1.1 使用@Autowired注解開啟自動(dòng)裝配模式(按類型) 說明:不管是使用配置文件還是配置類,都必須進(jìn)行對(duì)應(yīng)的Spring注解包掃描才可以使用。@Autowired默

    2024年02月14日
    瀏覽(31)
  • spring--Ioc控制反轉(zhuǎn)/DI依賴注入

    spring--Ioc控制反轉(zhuǎn)/DI依賴注入

    1.概念:在使用對(duì)象的時(shí)候,由主動(dòng)的new轉(zhuǎn)換為外部提供對(duì)象,將對(duì)象創(chuàng)建的控制權(quán)交給外部,即控制反轉(zhuǎn) 2.spring提供了一個(gè)容器,稱為IOC容器,用來從當(dāng)ioc中的外部 3.被管理或者被創(chuàng)建的對(duì)象在ioc中被叫做bean 使用步驟 1.導(dǎo)入依賴 spring-context 依賴,用到xml文件就需導(dǎo)入 2.創(chuàng)建

    2024年02月12日
    瀏覽(21)
  • Spring第二講:SpringIoC控制反轉(zhuǎn)、依賴注入

    4、1什么是IoC 在傳統(tǒng)的 Java 應(yīng)用中,一個(gè)類想要調(diào)用另一個(gè)類中的屬性或方法,通常會(huì)先在其代碼中通過 new 的方式將后者的對(duì)象創(chuàng)建出來,然后才能實(shí)現(xiàn)屬性或方法的調(diào)用。但在 Spring 應(yīng)用中,Java 對(duì)象創(chuàng)建的控制權(quán)是掌握在 IoC 容器手里,開發(fā)者通過XML或注解的配置將Java對(duì)

    2024年02月13日
    瀏覽(22)
  • 6.3Java EE——控制反轉(zhuǎn)與依賴注入

    一、控制反轉(zhuǎn)的概念 傳統(tǒng)面向?qū)ο蟪绦蛟O(shè)計(jì)原則 ????????控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC)是面向?qū)ο缶幊讨械囊粋€(gè)設(shè)計(jì)原則,用來降低程序代碼之間的耦合度。在傳統(tǒng)面向?qū)ο缶幊讨?,獲取對(duì)象的方式是用new主動(dòng)創(chuàng)建一個(gè)對(duì)象,也就是說應(yīng)用程序掌握著對(duì)

    2024年02月16日
    瀏覽(38)
  • CommunityToolkit.Mvvm8.1 IOC依賴注入控制反轉(zhuǎn)(5)

    ? 本系列文章導(dǎo)航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址) 希望提到的知識(shí)對(duì)您有所提示,同時(shí)歡迎交流和指正 作者:aierong 出處:https://www.cnblogs.com/aierong ? ? CommunityToolkit.Mvvm包不提供ioc功能,但是官方建議使用:Microsoft.Extensions.DependencyInject

    2023年04月14日
    瀏覽(26)
  • Springboot 入門指南:控制反轉(zhuǎn)和依賴注入的含義和實(shí)現(xiàn)方式

    目錄 一、什么是控制反轉(zhuǎn)(IoC)? 二、什么是依賴注入(DI)? 三、如何在 springboot 中使用 IoC 和 DI? 總結(jié) 控制反轉(zhuǎn)(Inversion of Control,簡稱 IoC)是一種設(shè)計(jì)原則,它的目的是降低代碼之間的耦合度,提高模塊化和可測(cè)試性??刂品崔D(zhuǎn)的含義是,將對(duì)象的創(chuàng)建、配置和管理

    2024年02月11日
    瀏覽(29)
  • Spring學(xué)習(xí)筆記(二)Spring的控制反轉(zhuǎn)(設(shè)計(jì)原則)與依賴注入(設(shè)計(jì)模式)

    是一種設(shè)計(jì)原則,降低程序代碼之間的耦合度 對(duì)象由Ioc容器統(tǒng)一管理,當(dāng)程序需要使用對(duì)象時(shí)直接從IoC容器中獲取。這樣對(duì)象的控制權(quán)就從應(yīng)用程序轉(zhuǎn)移到了IoC容器 依賴注入是一種消除類之間依賴關(guān)系的設(shè)計(jì)模式。例如,A類要依賴B類,A類不再直接創(chuàng)建B類,而是把這種依賴

    2024年02月19日
    瀏覽(21)
  • Spring5學(xué)習(xí)隨筆-IOC(反轉(zhuǎn)控制)、DI(依賴注入)和創(chuàng)建復(fù)雜對(duì)象

    Spring5學(xué)習(xí)隨筆-IOC(反轉(zhuǎn)控制)、DI(依賴注入)和創(chuàng)建復(fù)雜對(duì)象

    學(xué)習(xí)視頻:【孫哥說Spring5:從設(shè)計(jì)模式到基本應(yīng)用到應(yīng)用級(jí)底層分析,一次深入淺出的Spring全探索。學(xué)不會(huì)Spring?只因你未遇見孫哥】 控制:對(duì)于成員變量賦值的控制權(quán) 反轉(zhuǎn)控制:把對(duì)于成員變量賦值的控制權(quán),從代碼中反轉(zhuǎn)(轉(zhuǎn)移)到Spring工廠和配置文件中。 好處:解耦合

    2024年02月05日
    瀏覽(54)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包