欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

三種方法解決ASP.NET?Core?6中的依賴項(xiàng)

 更新時(shí)間:2021年11月23日 16:18:54   作者:編程寶庫(kù)  
這篇文章主要介紹了解決ASP.NET?Core?6依賴項(xiàng)的三種方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

依賴性注入是一種技術(shù),它允許我們注入一個(gè)特定類的依賴對(duì)象,而不是直接創(chuàng)建這些實(shí)例。

使用依賴注入的好處顯而易見,它通過放松模塊間的耦合,來增強(qiáng)系統(tǒng)的可維護(hù)性和可測(cè)試性。

依賴注入允許我們修改具體實(shí)現(xiàn),而不必改變依賴于它們的依賴類型。

ASP.NET Core 很重視依賴注入技術(shù)。ASP.NET Core 中內(nèi)置的依賴注入提供功能模塊,并不像 StructureMap 和 Ninject 等IoC(控制反轉(zhuǎn))容器那樣功能豐富,但它速度快,易于配置,而且易于使用。我們可以使用它在 ASP.NET Core 中注入框架服務(wù)和應(yīng)用程序服務(wù)。

關(guān)于依賴注入和控制反轉(zhuǎn)的有關(guān)知識(shí)可以參考:設(shè)計(jì)模式

我們將介紹三種不同方法來解決 ASP.NET Core 6 中的依賴項(xiàng)。

本文中提供的代碼示例均默認(rèn)運(yùn)行在 Visual Studio 2022。

1. 使用 VS2022 創(chuàng)建 ASP.NET Core 項(xiàng)目

我們?cè)?Visual Studio 2022 中創(chuàng)建一個(gè) ASP.NET Core 項(xiàng)目。按照以下步驟在 Visual Studio 2022 中創(chuàng)建一個(gè)新的 ASP.NET Core Web API 6 項(xiàng)目。

  • 1) 啟動(dòng) Visual Studio 2022 IDE。
  • 2) 單擊 “Create new project”。
  • 3) 在 “Create new project” 窗口中,從顯示的模板列表中選擇 “ASP.NET Core Web API”。
  • 4) 點(diǎn)擊下一步。
  • 5) 在 “Configure your new project” 窗口中,指定新項(xiàng)目的名稱和位置。
  • 6) 根據(jù)您的偏好,可選擇選中 “Place solution and project in the same directory” 復(fù)選框。
  • 7) 點(diǎn)擊下一步。
  • 8) 在接下來顯示的 “Additional Information” 窗口中,從頂部的下拉列表中選擇 .NET 6.0 作為目標(biāo)框架。將 “Authentication Type” 保留為 “None”(默認(rèn))。
  • 9) 確保未選中 “Enable Docker,”、“Configure for HTTPS” 和 “Enable Open API Support” 復(fù)選框,因?yàn)槲覀儾粫?huì)在此處使用任何這些功能。您也可以選擇取消選中 “Use controllers(取消選中以使用最少的 API)” 復(fù)選框,因?yàn)槲覀儗?chuàng)建自己的控制器。
  • 10) 單擊創(chuàng)建。

這將在 Visual Studio 2022 中創(chuàng)建一個(gè)新的 ASP.NET Core 6 Web API 項(xiàng)目。我們將在本文的后續(xù)部分中使用該項(xiàng)目來說明解析依賴項(xiàng)。

2. 使用構(gòu)造函數(shù)注入解決依賴關(guān)系

現(xiàn)在創(chuàng)建以下接口:

public interface ICustomFileLogger
{
    public string Text { get; set; }
    public void Log(string message);
}

為簡(jiǎn)單起見,我們給出一個(gè)最小的表示。

CustomFileLogger類實(shí)現(xiàn) ICustomFileLogger接口,代碼如下:

public class CustomFileLogger : ICustomFileLogger
{
    public string Text { get; set; }
    public void Log(string message)
    {
        // 自己的實(shí)現(xiàn)邏輯
    }
}

如果使用的是 ASP.NET 5,可以在 ConfigureServices方法中注冊(cè)一個(gè) ICustomFileLogger類型的實(shí)例作為一個(gè) Scoped服務(wù)。如果使用的是 ASP.NET 6,則直接在 Program.cs 文件中注冊(cè)。

services.AddScoped<ICustomFileLogger, CustomFileLogger>();

接下來,創(chuàng)建一個(gè)名為 DefaultController的 API 控制器并輸入以下代碼:

[Route("api/[controller]")]
[ApiController]
public class DefaultController : ControllerBase
{
    private ICustomFileLogger _logger;
    public DefaultController(ICustomFileLogger logger)
    {
        _logger = logger;
        if(string.IsNullOrEmpty(_logger.Text))
            _logger.Text = DateTime.UtcNow.ToString();
    }
    [HttpGet]
    public string Get()
    {
        return "Hello World!";
    }
}

注意這里是如何使用構(gòu)造函數(shù)注入的。DefaultController類的構(gòu)造函數(shù)接受 ICustomFileLogger類型的實(shí)例作為參數(shù)。

3. 使用動(dòng)作方法注入解決依賴關(guān)系

當(dāng)需要在多個(gè)方法中使用注入的實(shí)例時(shí),我們應(yīng)該使用構(gòu)造函數(shù)注入。如果只需要在特定的動(dòng)作方法中使用實(shí)例,最好在動(dòng)作方法中注入實(shí)例,而不是使用構(gòu)造函數(shù)注入。

以下代碼片段說明了如何實(shí)現(xiàn)動(dòng)作方法注入。

[HttpPost("Log")]
public IActionResult Log([FromServices] ICustomFileLogger customFileLogger)
{
    // 自己的實(shí)現(xiàn)邏輯
    return Ok();
}

4. 使用 IServiceProvider 解決依賴關(guān)系

我們有時(shí)候可能經(jīng)常需要在控制器中注入許多不同的服務(wù)。如果使用構(gòu)造函數(shù)注入,則必須在構(gòu)造函數(shù)中指定多個(gè)參數(shù)。所以,這種場(chǎng)景下,有一個(gè)更好的解決方案,就是使用 IServiceProvider。

我們可以使用 IServiceCollection接口來創(chuàng)建依賴項(xiàng)注入容器。一旦創(chuàng)建了容器,IServiceCollection實(shí)例就會(huì)組合成一個(gè) IServiceProvider實(shí)例。我們可以使用此實(shí)例來解析服務(wù)。

我們可以將 IServiceProvider類型的實(shí)例注入到類的任何方法中。您還可以利用 IApplicationBuilder接口的 ApplicationServices屬性和 HttpContext類的 RequestServices屬性來檢索 IServiceProvider實(shí)例。

以下代碼說明了如何注入 IServiceProvider類型的實(shí)例:

public class DefaultController : Controller
{
    private IServiceProvider _provider;
    public DefaultController(IServiceProvider provider)
    {
        _provider = provider;
    }
}

我們可以在操作方法中使用以下代碼,來檢索需要的任何服務(wù)實(shí)例。

ICustomFileLogger logger = (ICustomFileLogger)_provider.GetService(typeof(ICustomFileLogger));

注意 IServiceProviderGetService方法是如何用來檢索服務(wù)實(shí)例的。

我們可以使用 HttpContext類的 RequestServices屬性來檢索 IServiceProvider類型的實(shí)例,然后使用該實(shí)例調(diào)用 GetService方法。

以下代碼展示了HttpContext類如何做到檢索實(shí)例:

ICustomFileLogger logger = (ICustomFileLogger)HttpContext.RequestServices.GetService(typeof(ICustomFileLogger));

5. 總結(jié)

依賴性注入是一種通過放松耦合來增強(qiáng)代碼維護(hù)和可測(cè)試性的方法。

我們可以使用 ASP.NET Core 中內(nèi)置的依賴注入支持來創(chuàng)建模塊化、精簡(jiǎn)和干凈的應(yīng)用程序,同時(shí)也使應(yīng)用程序更容易維護(hù)和測(cè)試。

參考資料:

1. 設(shè)計(jì)模式

2. C#教程

到此這篇關(guān)于三種方法解決ASP.NET Core 6中的依賴項(xiàng)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 獲取當(dāng)前url

    獲取當(dāng)前url

    獲取當(dāng)前url...
    2006-08-08
  • ASP.NET?Core中HttpContext詳解與使用

    ASP.NET?Core中HttpContext詳解與使用

    這篇文章介紹了ASP.NET?Core中HttpContext詳解與使用,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • 詳解ABP框架的參數(shù)有效性驗(yàn)證和權(quán)限驗(yàn)證

    詳解ABP框架的參數(shù)有效性驗(yàn)證和權(quán)限驗(yàn)證

    ABP框架是基于ASP.NET的Web開發(fā)框架(GitHub: https://github.com/aspnetboilerplate),在ASP.NET框架之上又添加了更強(qiáng)大的功能,這里我們就來詳解ABP框架的參數(shù)有效性驗(yàn)證和權(quán)限驗(yàn)證
    2016-06-06
  • .NET Core 中的并發(fā)編程

    .NET Core 中的并發(fā)編程

    在.NET Core中,任務(wù) (tasks) 是并發(fā)編程的主要抽象表述,但還有其他支撐類可以使我們的工作更容易。下面小編和大家一起學(xué)習(xí)一下吧
    2019-05-05
  • .Net中的不可變集合(Immutable Collection)程序集簡(jiǎn)介

    .Net中的不可變集合(Immutable Collection)程序集簡(jiǎn)介

    這篇文章介紹了.Net中的不可變集合(Immutable Collection)程序集,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • ASP.NET Core依賴關(guān)系注入

    ASP.NET Core依賴關(guān)系注入

    這篇文章介紹了ASP.NET Core中的依賴關(guān)系注入,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • ASP.NET Core開發(fā)Docker部署

    ASP.NET Core開發(fā)Docker部署

    這篇文章介紹了ASP.NET Core開發(fā)Docker部署的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 常用C#關(guān)鍵字詳解教程(比較全面)

    常用C#關(guān)鍵字詳解教程(比較全面)

    學(xué)習(xí)C#很久了,但可能你也和我一樣,總有那么一兩個(gè)關(guān)鍵詞,說不清楚它是什么意思,有什么用,那么這篇文章就帶你一一講解。
    2016-04-04
  • asp.net實(shí)例代碼protected override void Render(HtmlTextWriter writer)

    asp.net實(shí)例代碼protected override void Render(HtmlTextWriter wri

    把最終要輸出的html壓縮后再輸出和最終輸出前先存為html文件,如果發(fā)布最新信息了,可以打開一次default.aspx,然后他又會(huì)生成一次html
    2008-08-08
  • AjaxControlToolKit DropDownExtender(下拉擴(kuò)展控件)使用方法

    AjaxControlToolKit DropDownExtender(下拉擴(kuò)展控件)使用方法

    由于工作的需要,使用了這個(gè)控件 挺簡(jiǎn)單,使用這個(gè)擴(kuò)展控件能輕松的吧 Label 控件 TextBox控件擴(kuò)展成類似DropDownList控件的功能。這樣使用既可以使用label控件或者textBox控件的一些屬性又能實(shí)現(xiàn)dropDownList的功能。
    2008-10-10

最新評(píng)論