最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中的依賴注入Dependency Injection DI的實(shí)現(xiàn)步驟

 更新時(shí)間:2025年06月29日 09:32:31   作者:CoderIsArt  
在C#中依賴注入是一種實(shí)現(xiàn)控制反轉(zhuǎn)的設(shè)計(jì)模式,用于解耦組件依賴關(guān)系,下面就來介紹一下依賴注入的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下

在C#中,依賴注入(Dependency Injection, DI)是一種實(shí)現(xiàn)控制反轉(zhuǎn)(IoC)的設(shè)計(jì)模式,用于解耦組件依賴關(guān)系。以下是基于 .NET Core/ .NET 5+ 的依賴注入配置詳細(xì)步驟和用法:

1. 基本概念

  • 服務(wù)(Service):被注入的依賴項(xiàng)(如接口、類)。
  • 容器(Container):管理服務(wù)的創(chuàng)建和生命周期(如 IServiceCollection)。
  • 生命周期
    • Transient:每次請求創(chuàng)建新實(shí)例。
    • Scoped:同一作用域內(nèi)共享實(shí)例(如一次HTTP請求)。
    • Singleton:全局單例。

2. 配置依賴注入的步驟

步驟1:定義服務(wù)接口和實(shí)現(xiàn)類

// 定義接口
public interface IMyService
{
    string GetMessage();
}

// 實(shí)現(xiàn)接口
public class MyService : IMyService
{
    public string GetMessage() => "Hello from MyService!";
}

步驟2:注冊服務(wù)到容器

在 Program.cs 或 Startup.cs(.NET 6+ 通常使用 Program.cs):

var builder = WebApplication.CreateBuilder(args);

// 注冊服務(wù)(生命周期可選)
builder.Services.AddTransient<IMyService, MyService>();      // 瞬時(shí)
builder.Services.AddScoped<IMyService, MyService>();         // 作用域
builder.Services.AddSingleton<IMyService, MyService>();      // 單例

// 直接注冊類(無接口)
builder.Services.AddTransient<MyService>();

步驟3:注入服務(wù)到目標(biāo)類

通過構(gòu)造函數(shù)注入:

public class MyController : ControllerBase
{
    private readonly IMyService _service;

    // 構(gòu)造函數(shù)自動(dòng)注入
    public MyController(IMyService service)
    {
        _service = service;
    }

    [HttpGet]
    public IActionResult Get()
    {
        return Ok(_service.GetMessage());
    }
}

3. 在非Web應(yīng)用(如WPF/控制臺)中使用DI

WPF 示例

安裝NuGet包

Install-Package Microsoft.Extensions.DependencyInjection

配置DI容器(在 App.xaml.cs):

public partial class App : Application
{
    public IServiceProvider ServiceProvider { get; private set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        var services = new ServiceCollection();
        
        // 注冊服務(wù)
        services.AddTransient<IMyService, MyService>();
        services.AddSingleton<MainWindow>(); // 注冊主窗口

        ServiceProvider = services.BuildServiceProvider();
        
        // 解析主窗口并顯示
        var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();
        mainWindow.Show();
    }
}

在窗口/ViewModel中注入

public partial class MainWindow : Window
{
    public MainWindow(IMyService service)
    {
        InitializeComponent();
        var message = service.GetMessage(); // 使用注入的服務(wù)
    }
}

4. 高級用法

4.1 注入多個(gè)實(shí)現(xiàn)(命名或策略模式)

// 注冊多個(gè)實(shí)現(xiàn)
builder.Services.AddTransient<IMyService, ServiceA>();
builder.Services.AddTransient<IMyService, ServiceB>();

// 通過 IEnumerable<T> 獲取所有實(shí)現(xiàn)
public class Consumer
{
    public Consumer(IEnumerable<IMyService> services)
    {
        foreach (var service in services)
        {
            service.DoSomething();
        }
    }
}

4.2 使用工廠模式動(dòng)態(tài)創(chuàng)建服務(wù)

builder.Services.AddTransient<IMyService>(provider => 
{
    var config = provider.GetRequiredService<IConfiguration>();
    return new MyService(config.GetValue<string>("Mode"));
});

4.3 生命周期管理注意事項(xiàng)

  • 避免Singleton依賴Scoped服務(wù):可能導(dǎo)致Captive Dependency問題。
  • IDisposable處理:容器會自動(dòng)釋放實(shí)現(xiàn)了 IDisposable 的服務(wù)。

5. 常見問題解決

錯(cuò)誤:未注冊服務(wù)

System.InvalidOperationException: No service for type 'IMyService' has been registered.

解決:檢查服務(wù)是否在 IServiceCollection 中正確注冊。

循環(huán)依賴
重構(gòu)代碼以避免構(gòu)造函數(shù)循環(huán)引用,或用 Lazy<T> 延遲初始化。

6. 總結(jié)表格

操作代碼示例說明
注冊Transient服務(wù)services.AddTransient<IMyService, MyService>();每次請求新實(shí)例
注冊Scoped服務(wù)services.AddScoped<IMyService, MyService>();同一作用域內(nèi)共享實(shí)例
注冊Singleton服務(wù)services.AddSingleton<IMyService, MyService>();全局單例
構(gòu)造函數(shù)注入public MyClass(IMyService service)自動(dòng)解析依賴
手動(dòng)解析服務(wù)var service = provider.GetRequiredService<IMyService>();從容器獲取實(shí)例

通過以上步驟,可以靈活地在C#項(xiàng)目中配置和使用依賴注入,提升代碼的可測試性和可維護(hù)性。

到此這篇關(guān)于C#中的依賴注入Dependency Injection DI的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)C# 依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#類的多態(tài)性詳解

    C#類的多態(tài)性詳解

    這篇文章主要為大家詳細(xì)介紹了C#類的多態(tài)性,主要有兩種:一是編譯時(shí)的多態(tài)性,二是運(yùn)行時(shí)的多態(tài)性,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-10-10
  • C#如何更改Word的語言設(shè)置

    C#如何更改Word的語言設(shè)置

    這篇文章主要為大家詳細(xì)介紹了C#如何更改Word的語言設(shè)置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C#使用Automation實(shí)現(xiàn)控制自動(dòng)撥打接聽電話

    C#使用Automation實(shí)現(xiàn)控制自動(dòng)撥打接聽電話

    這篇文章主要為大家詳細(xì)介紹了C#如何使用Automation實(shí)現(xiàn)控制自動(dòng)撥打接聽電話,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C#并行編程之?dāng)?shù)據(jù)并行Tasks.Parallel類

    C#并行編程之?dāng)?shù)據(jù)并行Tasks.Parallel類

    這篇文章介紹了C#并行編程之?dāng)?shù)據(jù)并行Tasks.Parallel類,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • c#?理解csredis庫實(shí)現(xiàn)分布式鎖的詳細(xì)流程

    c#?理解csredis庫實(shí)現(xiàn)分布式鎖的詳細(xì)流程

    這篇文章主要介紹了c#?理解csredis實(shí)現(xiàn)分布式鎖,該庫本身已經(jīng)足夠完善,這里我畫蛇添足一下,為了方便自己的使用,本文通過實(shí)例代碼給大家詳細(xì)介紹,需要的朋友可以參考下
    2022-02-02
  • 關(guān)于C#?調(diào)用Dll?傳遞字符串指針參數(shù)的問題

    關(guān)于C#?調(diào)用Dll?傳遞字符串指針參數(shù)的問題

    這篇文章主要介紹了C#?調(diào)用Dll傳遞字符串指針參數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • C#使用LOCK實(shí)現(xiàn)線程同步

    C#使用LOCK實(shí)現(xiàn)線程同步

    這篇文章介紹了C#使用LOCK實(shí)現(xiàn)線程同步的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 關(guān)于C#執(zhí)行順序帶來的一些潛在問題

    關(guān)于C#執(zhí)行順序帶來的一些潛在問題

    這篇文章主要給大家介紹了關(guān)于C#執(zhí)行順序帶來的一些潛在問題,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C語言使用getch()讀取方向鍵

    C語言使用getch()讀取方向鍵

    getch()是編程中所用的函數(shù),這個(gè)函數(shù)是一個(gè)不回顯函數(shù),當(dāng)用戶按下某個(gè)字符時(shí),函數(shù)自動(dòng)讀取,無需按回車,有的C語言命令行程序會用到此函數(shù)做游戲,但是這個(gè)函數(shù)并非標(biāo)準(zhǔn)函數(shù),要注意移植性
    2021-07-07
  • C#?重寫Notification提示窗口的示例代碼

    C#?重寫Notification提示窗口的示例代碼

    本文主要介紹了C#?重寫Notification提示窗口的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論

达拉特旗| 无锡市| 乳山市| 天台县| 新乐市| 临海市| 镇雄县| 油尖旺区| 浑源县| 布拖县| 宿迁市| 信宜市| 黎平县| 阆中市| 日土县| 夏邑县| 施甸县| 澎湖县| 石景山区| 香港| 呼和浩特市| 浦县| 兴义市| 大洼县| 普兰县| 柞水县| 定结县| 淮南市| 措勤县| 资中县| 名山县| 清丰县| 开化县| 泸溪县| 兴化市| 儋州市| 玛多县| 长泰县| 布尔津县| 凤台县| 宁南县|