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

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

 更新時間:2022年04月06日 11:23:23   作者:暗斷腸  
這篇文章介紹了ASP.NET Core中的依賴關(guān)系注入,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1.前言

面向?qū)ο笤O計(OOD)里有一個重要的思想就是依賴倒置原則(DIP),并由該原則牽引出依賴注入(DI)、控制反轉(zhuǎn)(IOC)及其容器等老生常談的概念,初學者很容易被這些概念搞暈(包括我在內(nèi)),在學習Core依賴注入服務之前,下面讓我們先了解下依賴倒置原則(DIP)、依賴注入(DI)、控制反轉(zhuǎn)(IOC)等概念,然后再深入學習Core依賴注入服務。

2.依賴倒置原則(DIP)

高層模塊不依賴于低層模塊的實現(xiàn),而低層模塊依賴于高層模塊定義的接口。通俗來講,就是高層模塊定義接口,低層模塊負責實現(xiàn)。

2.依賴注入(DI)

2.1依賴(D)

當一個類需要另一個類協(xié)作來完成工作的時候就產(chǎn)生了依賴。
示例1:

public class MyDependency
{
    public MyDependency()
    {
    }
    public Task WriteMessage(string message)
    {
        Console.WriteLine($"MyDependency.WriteMessage called. Message: {message}");
        return Task.FromResult(0);
    }
}
public class IndexModel : PageModel
{
    MyDependency _dependency = new MyDependency();
    public void OnGet()
    {
        _dependency.WriteMessage("IndexModel.OnGet created this message.");
    }
}

由上述代碼可以看到IndexModel模塊輸出消息必須要實例化MyDependency模塊,也就是說IndexModel模塊業(yè)務的實現(xiàn)必須依賴于MyDependency模塊,這就是依賴。

2.2 注入(I)

根據(jù)DIP設計原則:高層模塊不依賴于低層模塊的實現(xiàn),而低層模塊依賴于高層模塊定義的接口,所以我們在這里定義一個接口供高層模塊調(diào)用,底層模塊負責實現(xiàn)。
示例2:

public interface IMyDependency
{
    Task WriteMessage(string message);
}
public class MyDependency: IMyDependency
{
    public MyDependency()
    {
    }
    public Task WriteMessage(string message)
    {
        Console.WriteLine($"MyDependency.WriteMessage called. Message: {message}");
        return Task.FromResult(0);
    }
}
public class IndexModel : PageModel
{
    IMyDependency _dependency = new MyDependency();
    public void OnGet()
    {
        _dependency.WriteMessage("IndexModel.OnGet created this message.");
    }
}

從上述代碼可以看到當我們調(diào)用IndexModel模塊OnGetAsync方法的時候,是通過IMyDependency接口實例化MyDependency類去實現(xiàn)其方法內(nèi)容的,這叫控制正轉(zhuǎn)。但是Master說,我們不應該創(chuàng)建MyDependency類,而是讓調(diào)用者給你傳遞,于是你通過構(gòu)造函數(shù)讓外界把這兩個依賴給你。
示例3:

public interface IMyDependency
{
    Task WriteMessage(string message);
}
public class MyDependency : IMyDependency
{
    private readonly ILogger<MyDependency> _logger;
    public MyDependency(ILogger<MyDependency> logger)
    {
        _logger = logger;
    }
    public Task WriteMessage(string message)
    {
        _logger.LogInformation(
            "MyDependency.WriteMessage called. Message: {MESSAGE}",
            message);
        return Task.FromResult(0);
    }
}
public class IndexModel : PageModel
{
    private readonly IMyDependency _dependency;
    public IndexModel(IMyDependency dependency)
    {
        _dependency = dependency;
    }
    public void OnGet()
    {
        _dependency.WriteMessage("IndexModel.OnGet created this message.");
    }
}

從上述代碼可以看到把依賴的創(chuàng)建丟給第三方系統(tǒng)(例:Autofac,Unity容器),也叫控制反轉(zhuǎn)(IOC)容器。自己只負責使用,其它人丟給你依賴的這個過程理解為注入。也叫控制反轉(zhuǎn)(IOC)。注意,框架內(nèi)部ILogger接口已注入,無需手動再重新注入。

2.3 IOC容器

IOC容器可以看作是負責統(tǒng)一管理依賴關(guān)系的地方。常見有Autofac,Unity。
容器只要負責兩件事情:
●綁定服務與實例之間的關(guān)系
●獲取實例,并對實例進行管理(創(chuàng)建與銷毀)

3.依賴倒置原則(DIP)與控制反轉(zhuǎn)(IOC)的區(qū)別

DIP是一種軟件設計原則,它僅僅告訴你高低層模塊之間應該如何依賴,但是它并沒有告訴我們?nèi)绾谓獬嗷ヒ蕾嚹K的耦合。而IOC則是一種軟件設計模式,它告訴我們該如何解除模塊的耦合,它為相互依賴的組件提供抽象,將依賴(低層模塊)對象的獲得交給第三方系統(tǒng)(例:Autofac,Unity容器)來控制,即依賴對象不在被依賴模塊的類中直接通過new來獲取。

4.NET Core依賴注入(DI)服務

經(jīng)過上面描述,大家應該應該對依賴倒置原則(DIP)、依賴注入(DI)、控制反轉(zhuǎn)(IOC)這幾個概念有一定了解對吧。在.NET Core中DI的核心分為兩個組件:IServiceCollection和 IServiceProvider。

  • IServiceCollection負責注冊
  • IServiceProvider負責提供實例

下面讓我們來學習下NET Core是怎么依賴注入(DI)服務。
第一步:使用接口來實現(xiàn)依賴反轉(zhuǎn)。定義 IMyDependency 服務。

public interface IMyDependency
{
    Task WriteMessage(string message);
}

第二步:定義IMyDependency 服務的實現(xiàn)類MyDependency。

public class MyDependency : IMyDependency
{
    private readonly ILogger<MyDependency> _logger;
    public MyDependency(ILogger<MyDependency> logger)
    {
        _logger = logger;
    }
    public Task WriteMessage(string message)
    {
        _logger.LogInformation(
            "MyDependency.WriteMessage called. Message: {MESSAGE}",
            message);
        return Task.FromResult(0);
    }
}

第三步:把IMyDependency 服務注冊到服務容器中。

public void ConfigureServices(IServiceCollection services)
{
//注冊將服務生命期的范圍限定為單個請求的生命期,下節(jié)再來聊服務生命期
    services.AddScoped<IMyDependency, MyDependency>();
}

第四步:把服務注入到使用它的類的構(gòu)造函數(shù)中。在HomeController里面調(diào)用IndexModel.OnGet方法輸出WriteMessage消息。

public class IndexModel : PageModel
{
    private readonly IMyDependency _dependency;
    public IndexModel(IMyDependency dependency)
    {
        _dependency = dependency;
    }
    public void OnGet()
    {
        _dependency.WriteMessage("IndexModel.OnGet created this message.");
    }
}
private readonly IMyDependency _iMyDependency;
public HomeController(IMyDependency iMyDependency)
{
    _iMyDependency = iMyDependency;
}
public IActionResult Index()
{
    IndexModel _IndexModel = new IndexModel(_iMyDependency);
    _IndexModel.OnGet();
    return View();
}

WriteMessage日志消息如下:

5.默認服務容器替換

下面我們將來演示內(nèi)置容器怎么替換為其他容器示例,比如替換第三方 Autofac容器,我們需要在Startup.ConfigureServices方法里面注冊Autofac容器,具體代碼如下:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    // Add Autofac
    var containerBuilder = new ContainerBuilder();
    containerBuilder.RegisterModule<DefaultModule>();
    containerBuilder.Populate(services);
    var container = containerBuilder.Build();
    return new AutofacServiceProvider(container);
}

這里需要注意的是如果需要使用第三方容器,Startup.ConfigureServices 必須返回 IServiceProvider。然后自定義一個模塊類配置依賴關(guān)系,具體代碼如下:

public class DefaultModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<CharacterRepository>().As<ICharacterRepository>();
    }
}

應用程序在運行時,使用 Autofac 來解析類型,并注入依賴關(guān)系。

到此這篇關(guān)于ASP.NET Core依賴關(guān)系注入的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET?MVC模式中應用程序結(jié)構(gòu)詳解

    ASP.NET?MVC模式中應用程序結(jié)構(gòu)詳解

    本文詳細講解了ASP.NET?MVC模式中的應用程序結(jié)構(gòu),對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03
  • ASP.NET Calendar日歷(日期)控件使用方法

    ASP.NET Calendar日歷(日期)控件使用方法

    本文主要介紹Calendar日歷控件的各個屬性以及舉例演示Calendar控件的具體使用方法,希望對大家有所幫助。
    2016-04-04
  • Asp.net基礎知識掃盲篇

    Asp.net基礎知識掃盲篇

    這篇文章主要介紹了Asp.net基礎知識掃盲篇與問答篇對想了解asp.net的朋友應該有所幫助
    2021-05-05
  • ASP.NET中 CheckBox復選框控件的使用

    ASP.NET中 CheckBox復選框控件的使用

    本文主要介紹ASP.NET中CheckBox復選框控件的使用,并舉例演示其用法,希望對大家有所幫助。
    2016-04-04
  • ADO.NET基礎知識詳解

    ADO.NET基礎知識詳解

    本文詳細講解了ADO.NET基礎知識,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • ASP.NET?Core中的Blazor組件介紹

    ASP.NET?Core中的Blazor組件介紹

    這篇文章介紹了ASP.NET?Core中的Blazor組件,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • ASP.NET Core讀取配置文件

    ASP.NET Core讀取配置文件

    這篇文章介紹了ASP.NET Core讀取配置文件的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解

    ASP.NET 中 Button、LinkButton和ImageButton 三種控件的使用詳解

    本文主要介紹Button、LinkButton和ImageButton 三種控件的使用方法,并一一舉例演示它們的用法,希望對大家有所幫助。
    2016-04-04
  • ASP.NET Core基礎之中間件

    ASP.NET Core基礎之中間件

    這篇文章介紹了ASP.NET Core基礎之中間件,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-02-02
  • ASP.NET Substitution 控件的使用方法

    ASP.NET Substitution 控件的使用方法

    Substitution 控件可用于采用緩存配置的 ASP.NET 網(wǎng)頁上。使用 Substitution 控件,可以在網(wǎng)頁上創(chuàng)建一些區(qū)域,這些區(qū)域可以動態(tài)更新,然后集成到緩存的網(wǎng)頁中。
    2016-04-04

最新評論

成安县| 泰兴市| 永兴县| 虞城县| 西和县| 常山县| 调兵山市| 玉屏| 甘洛县| 甘洛县| 政和县| 常州市| 榆社县| 郸城县| 曲麻莱县| 沙田区| 梁山县| 临城县| 会东县| 屏边| 富锦市| 佛山市| 工布江达县| 昭苏县| 吉安县| 施甸县| 伊宁市| 永胜县| 固阳县| 和静县| 商南县| 北碚区| 兴城市| 敦化市| 固镇县| 南昌市| 盐山县| 甘德县| 肃南| 安丘市| 多伦县|