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

ASP.NET Core 依賴注入詳細

 更新時間:2021年10月11日 15:45:44   作者:故人與貓  
這篇文章主要介紹ASP.NET Core 依賴注入,ASP.NET Core 應用在啟動過程中會依賴各種組件提供服務,這些組件會以接口的形式標準化,這些組件就是我們所說的服務,ASP.NET Core框架建立在一個底層的依賴注入框架之上,它使用容器提供所需的服務,下面我們就來詳細了解一下

前言:

ASP.NET Core 應用在啟動過程中會依賴各種組件提供服務,而這些組件會以接口的形式標準化,這些組件這就是我們所說的服務,ASP.NET Core框架建立在一個底層的依賴注入框架之上,它使用容器提供所需的服務。要了解依賴注入容器以及它的機制,我們需要了解什么是依賴注入。

一、控制反轉(zhuǎn)

說道依賴注入就不得不提控制反轉(zhuǎn)(IoC)。
定義: 高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節(jié);細節(jié)應該依賴抽象。
相對于細節(jié)的多變性,抽象的東西要穩(wěn)定的多。以抽象為基礎搭建起來的架構(gòu)比以細節(jié)為基礎搭建起來的架構(gòu)要穩(wěn)定的多。在.NET中,抽象指的是接口或者抽象類,細節(jié)就是具體的實現(xiàn)類,使用接口或者抽象類的目的是制定好規(guī)范和契約,而不去涉及任何具體的操作,把展現(xiàn)細節(jié)的任務交給他們的實現(xiàn)類去完成。

二、好萊塢法則

“不要給我們打電話,我們會給你打電話(don‘t call us, we‘ll call you)”這是著名的好萊塢原則。在好萊塢,把簡歷遞交給演藝公司后就只有回家等待。由演藝公司對整個娛樂項的完全控制,演員只能被動式的接受公司的差使,在需要的環(huán)節(jié)中,完成自己的演出。IIOC的原理就是基于好萊塢原則,所有的組件都是被動的(Passive),所有的組件初始化和調(diào)用都由容器負責。
ASP.NET MVC開發(fā)來說,我們只需按照約定的規(guī)則(定義好的目錄或命名規(guī)則)定義對應的controllerView文件即可。整個框架會根據(jù)路由規(guī)則解析的參數(shù)到目標Controller,如果目標Action方法需要呈現(xiàn)一個View,框架會根據(jù)約定找到對應的的View文件( .cshtml文件),對其進行動態(tài)編譯生成html回復給客戶端,整個框架都體現(xiàn)了IoC思想。

三、流程控制

IoC是將流程的控制從應用程序當中遷移到框架當中,框架利用一個引擎驅(qū)動整個流程的自動執(zhí)行。應用程序無須關(guān)心工作流程的細節(jié),它只需要啟動這個引擎即可??蚣軙蕴娑〉男问教峁U展點,應用程序通過注冊擴展的方式實現(xiàn)對某個環(huán)節(jié)的控制。一旦這個引擎(容器)被啟動,注冊的擴展就會自動參與整個流程的執(zhí)行。

通過上面這張圖不難看出IoC在其中起到的作用。
未使用前: 整個程序相互依賴,當新的需求被提出時,牽一發(fā)而動全身,這是我們最不想看到的,在小項目中還能理清關(guān)系,當需求越來越多,簡直不可想象。
開始使用: 在引入第三方后,各個模塊之間沒有耦合關(guān)系,將依賴降至最低,所有控制都通過IoC集中控制。
使用后: 為了方便觀察把中間的IoC容器拿掉后,可以看出各個模塊之間已經(jīng)沒有耦合關(guān)系,修改單一模塊后,再也不需要考慮其他模塊。

四、三種依賴注入方式

1.構(gòu)造器注入

構(gòu)造器注入就是在構(gòu)造函數(shù)中借助參數(shù)將依賴的對象注入由他創(chuàng)建的對象當中。平時基本都是使用其中的構(gòu)造函數(shù)方式實現(xiàn)注入。

    public class A
    {
        public IB B { get; }
        public A(IB b) => B = b;
    }

ASP.NET Core 中的使用

   

 [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }

2.屬性注入

通過標注InjectionAttribute特性的方式可以將屬性設置為自動注入的依賴屬性。

    public class A
    {
        public IB B { get; set; }
        [Injection]
        public IC C { get; set; }
    }

3.方法注入

同樣通過標注InjectionAttribute特性的方式可以將該方法標注為注入方法。

    public class A
    {
        public IB B { get; }
        [Injection]
        public Initialize(IB b) => B = b;
    }


除了通過容器初始化服務過程中自動調(diào)用實現(xiàn),我們還可以利用它實現(xiàn)另一種更加自由的方法注入,這種方式在ASP.NET Core中廣范應用。在ASP.NET Core啟動時會調(diào)用Startup對象完成中間件注冊,而定義Startup類型時候不需要讓他實現(xiàn)某個接口,所以注冊Configure方法沒有一個固定聲明,但可以通過下面方法將任意依賴服務注冊到這個方法當中。

  

  public class Startup
    {
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication1 v1"));
            }

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

五、生命周期

AddSingleton的生命周期: 項目啟動-項目關(guān)閉 相當于靜態(tài)類 只會有一個
AddScoped的生命周期: 請求開始-請求結(jié)束 在這次請求中獲取的對象都是同一個
AddTransient的生命周期: 請求獲取-(GC回收-主動釋放) 每一次獲取的對象都不是同一個

注意:由于AddScoped對象是在請求的時候創(chuàng)建的,所以不能在AddSingleton對象中使用,甚至也不能在AddTransient對象中使用。
權(quán)重: AddSingleton→AddTransient→AddScoped

六、ASP.Net Core 中自帶的注入 

       public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<IA, A>;
            services.AddSingleton<IB, B>;
            services.AddTransient<IC, C>;
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
            });
        }

注意: ASP.Net Core中的注入還是比較簡單的,但是當服務變得越來越多時,手動注入就比較麻煩了,后續(xù)在介紹其他IoC框架。

到此這篇關(guān)于ASP.NET Core 依賴注入詳細的文章就介紹到這了,更多相關(guān) ASP.NET Core 依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • .NET6新特性之 隱式命名空間引用

    .NET6新特性之 隱式命名空間引用

    本文給大家分享的是 .NET6特新 隱式命名空間引用,如果我們要在新加一個命名空間的引用,可以在項目文件中配置增加<Using Include="命名空間"/>,如果需要移除一個命名空間可以這么做<Using Remove="命名空間"/>,下面來看看文章詳細介紹內(nèi)容吧,需要的朋友可以參考一下
    2021-11-11
  • .net中線程同步的典型場景和問題剖析

    .net中線程同步的典型場景和問題剖析

    在使用多線程進行編程時,有一些經(jīng)典的線程同步問題,對于這些問題,.net提供了多種不同的類來解決
    2012-11-11
  • asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

    asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

    學習是使用asp.net已經(jīng)有很長一段時間了,現(xiàn)在就來分析一下mvc的整過過程吧。個人計劃寫一個mvc系列的博文,僅從源代碼的角度來分析mvc。在接觸mvc時我們一定會經(jīng)歷路由,那么路由這東東是怎么搞出來的啊
    2012-11-11
  • .Net 6中的PeriodTimer介紹

    .Net 6中的PeriodTimer介紹

    這篇文章主要介紹了.Net 6中的PeriodTimer,.net 6中新增了一個異步計時器PeroidTimer,相對普通Timer的回調(diào), 它的模型更簡單,下面一起來看看具體詳情吧
    2022-01-01
  • .NET6新特新?struct優(yōu)化

    .NET6新特新?struct優(yōu)化

    這篇文章主要給大家分享的是?NET6新特新?struct優(yōu)化,在.NET6中針對Struct做了一些優(yōu)化,下面我們就通過一些案例來看一下.NET6中針對Struct的優(yōu)化,需要的朋友可以參考一下,希望對大家有所幫助
    2021-11-11
  • .Net性能調(diào)優(yōu)-ArrayPool詳情

    .Net性能調(diào)優(yōu)-ArrayPool詳情

    ArrayPool具有高性能 托管 數(shù)組緩沖池,可重復使用,用 租用 空間的方式代替 重新分配 數(shù)組空間的行為的特點及可以在頻繁創(chuàng)建和銷毀數(shù)組的情況下 提高性能 ,減少垃圾回收器的壓力的優(yōu)點,下面文章內(nèi)容將詳細對其做介紹,需要的朋友可以參考一下
    2021-09-09
  • .Net?Core?配置文件讀取IOptions,IOptionsMonitor,IOptionsSnapshot

    .Net?Core?配置文件讀取IOptions,IOptionsMonitor,IOptionsSnapshot

    這篇文章主要介紹了.Net?Core配置文件讀取IOptions,IOptionsMonitor,IOptionsSnapshot,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • 為什么ASP.NET Core 數(shù)據(jù)庫連接串的值和appsettings.json配的不一樣?

    為什么ASP.NET Core 數(shù)據(jù)庫連接串的值和appsettings.json配的不一樣?

    這篇文章主要介紹了為什么數(shù)據(jù)庫連接串的值和appsettings.json配的不一樣?下面我們就帶著疑問閱讀下文,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • ASP.NET入門數(shù)據(jù)篇

    ASP.NET入門數(shù)據(jù)篇

    ASP.NET入門數(shù)據(jù)篇...
    2006-07-07
  • .NET?中配置從xml轉(zhuǎn)向json方法示例詳解

    .NET?中配置從xml轉(zhuǎn)向json方法示例詳解

    這篇文章主要為大家介紹了.NET?中配置從xml轉(zhuǎn)向json方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論