ASP.NET Core依賴(lài)注入DI容器的方法實(shí)現(xiàn)
ASP.NET Core 是一個(gè)跨平臺(tái)、高性能的框架,它提供了一種依賴(lài)注入(DI)容器,用于管理應(yīng)用程序中的對(duì)象和服務(wù)。DI 是一種設(shè)計(jì)模式,它通過(guò)將對(duì)象的創(chuàng)建和管理分離出來(lái),實(shí)現(xiàn)了應(yīng)用程序的松耦合,提高了代碼的可維護(hù)性、可測(cè)試性和可擴(kuò)展性。
一、注冊(cè)服務(wù)
在 ASP.NET Core 中,DI 容器使用 IServiceCollection 接口來(lái)注冊(cè)服務(wù)。IServiceCollection 接口定義了一組方法,用于向 DI 容器中注冊(cè)服務(wù)。常用的注冊(cè)方法包括:
- AddTransient<TService, TImplementation>():向 DI 容器中注冊(cè)一個(gè)瞬時(shí)生命周期的服務(wù)。每次請(qǐng)求該服務(wù)時(shí),都會(huì)創(chuàng)建一個(gè)新的實(shí)例。
- AddScoped<TService, TImplementation>():向 DI 容器中注冊(cè)一個(gè)作用域生命周期的服務(wù)。每次請(qǐng)求該服務(wù)時(shí),都會(huì)創(chuàng)建一個(gè)新的實(shí)例,并在同一作用域內(nèi)共享該實(shí)例。
- AddSingleton<TService, TImplementation>():向 DI 容器中注冊(cè)一個(gè)單例生命周期的服務(wù)。在應(yīng)用程序的整個(gè)生命周期中,只會(huì)創(chuàng)建一個(gè)實(shí)例,并在整個(gè)應(yīng)用程序中共享該實(shí)例。
除了上述常用的注冊(cè)方法,IServiceCollection 還提供了一些其他的注冊(cè)方法,例如:
- AddTransient():向 DI 容器中注冊(cè)一個(gè)瞬時(shí)生命周期的服務(wù)。服務(wù)的實(shí)現(xiàn)類(lèi)型由 TService 的實(shí)現(xiàn)類(lèi)型決定。
- AddScoped():向 DI 容器中注冊(cè)一個(gè)作用域生命周期的服務(wù)。服務(wù)的實(shí)現(xiàn)類(lèi)型由 TService 的實(shí)現(xiàn)類(lèi)型決定。
- AddSingleton():向 DI 容器中注冊(cè)一個(gè)單例生命周期的服務(wù)。服務(wù)的實(shí)現(xiàn)類(lèi)型由 TService 的實(shí)現(xiàn)類(lèi)型決定。
除了注冊(cè)服務(wù)的方法之外,IServiceCollection 還提供了一些其他的方法,例如:
- TryAddTransient<TService, TImplementation>():嘗試向 DI 容器中注冊(cè)一個(gè)瞬時(shí)生命周期的服務(wù)。如果該服務(wù)已經(jīng)存在,則不進(jìn)行注冊(cè)。
- TryAddScoped<TService, TImplementation>():嘗試向 DI 容器中注冊(cè)一個(gè)作用域生命周期的服務(wù)。如果該服務(wù)已經(jīng)存在,則不進(jìn)行注冊(cè)。
- TryAddSingleton<TService, TImplementation>():嘗試向 DI 容器中注冊(cè)一個(gè)單例生命周期的服務(wù)。如果該服務(wù)已經(jīng)存在,則不進(jìn)行注冊(cè)。
示例代碼:
public void ConfigureServices(IServiceCollection services)
{
// 注冊(cè)一個(gè)瞬時(shí)生命周期的服務(wù)
services.AddTransient<IMyService, MyService>();
// 注冊(cè)一個(gè)作用域生命周期的服務(wù)
services.AddScoped<IMyScopedService, MyScopedService>();
// 注冊(cè)一個(gè)單例生命周期的服務(wù)
services.AddSingleton<IMySingletonService, MySingletonService>();
}
二、解析依賴(lài)
在 ASP.NET Core 中,DI 容器使用 IServiceProvider 接口來(lái)解析依賴(lài),獲取服務(wù)的實(shí)例。IServiceProvider 接口定義了一個(gè) GetService 方法,用于獲取指定類(lèi)型的服務(wù)實(shí)例。示例代碼:
public class MyController : Controller
{
private readonly IMyService _myService;
public MyController(IServiceProvider serviceProvider)
{
// 通過(guò) IServiceProvider 解析依賴(lài)
_myService = serviceProvider.GetService<IMyService>();
}
public IActionResult Index()
{
var message = _myService.GetMessage();
return View(model: message);
}
}
在上面的代碼中,MyController 類(lèi)的構(gòu)造函數(shù)接收一個(gè) IServiceProvider 實(shí)例作為參數(shù),通過(guò) IServiceProvider.GetService() 方法獲取 IMyService 實(shí)例。在 Index 方法中,調(diào)用 _myService.GetMessage() 方法獲取消息,并將其傳遞給視圖。
三、實(shí)現(xiàn)自定義的服務(wù)提供程序
在 ASP.NET Core 中,可以通過(guò)實(shí)現(xiàn) IServiceProvider 接口來(lái)實(shí)現(xiàn)自定義的服務(wù)提供程序。IServiceProvider 接口只定義了一個(gè) GetService 方法,用于獲取指定類(lèi)型的服務(wù)實(shí)例。示例代碼:
public class MyServiceProvider : IServiceProvider
{
public object GetService(Type serviceType)
{
if (serviceType == typeof(IMyService))
{
return new MyService();
}
else if (serviceType == typeof(IMyScopedService))
{
return new MyScopedService();
}
else if (serviceType == typeof(IMySingletonService))
{
return new MySingletonService();
}
else
{
return null;
}
}
}
在上面的代碼中,MyServiceProvider 類(lèi)實(shí)現(xiàn)了 IServiceProvider 接口,并重寫(xiě)了 GetService 方法。在 GetService 方法中,根據(jù)服務(wù)類(lèi)型返回相應(yīng)的服務(wù)實(shí)例。
要使用自定義的服務(wù)提供程序,可以在 Startup 類(lèi)的 ConfigureServices 方法中調(diào)用 services.AddSingleton<IServiceProvider, MyServiceProvider>() 方法將其注冊(cè)到 DI 容器中。示例代碼:
public void ConfigureServices(IServiceCollection services)
{
// 注冊(cè)自定義的服務(wù)提供程序
services.AddSingleton<IServiceProvider, MyServiceProvider>();
}
四、總結(jié)
ASP.NET Core 的 DI 容器提供了一種簡(jiǎn)單、靈活的方式來(lái)管理應(yīng)用程序中的對(duì)象和服務(wù)。通過(guò)注冊(cè)服務(wù)、解析依賴(lài)和實(shí)現(xiàn)自定義的服務(wù)提供程序,可以實(shí)現(xiàn)應(yīng)用程序的松耦合,提高代碼的可維護(hù)性、可測(cè)試性和可擴(kuò)展性。在開(kāi)發(fā) ASP.NET Core 應(yīng)用程序時(shí),應(yīng)該充分利用 DI 容器,提高代碼的質(zhì)量和效率。
到此這篇關(guān)于ASP.NET Core依賴(lài)注入DI容器的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)ASP.NET Core依賴(lài)注入DI容器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- ASP.NET Core 依賴(lài)注入生命周期示例詳解
- Asp.net?core中依賴(lài)注入的實(shí)現(xiàn)
- ASP.NET?Core依賴(lài)注入(DI)講解
- ASP.NET?Core依賴(lài)注入詳解
- ASP.NET?Core?MVC創(chuàng)建控制器與依賴(lài)注入講解
- .Net?Core依賴(lài)注入IOC和DI介紹
- ASP.NET Core 依賴(lài)注入詳細(xì)
- ASP.NET Core實(shí)現(xiàn)自動(dòng)依賴(lài)注入
- .net core三種依賴(lài)注入方式(原生的依賴(lài)注入器,scrutor,autofac)
相關(guān)文章
ASP.NET Core依賴(lài)注入系列教程之服務(wù)的注冊(cè)與提供
這篇文章主要給大家介紹了關(guān)于ASP.NET Core依賴(lài)注入系列教程之服務(wù)的注冊(cè)與提供的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-11-11
Asp.net core實(shí)現(xiàn)PushStream視頻流推送
這篇文章介紹了Asp.net core實(shí)現(xiàn)PushStream視頻流推送的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Asp.net 通用萬(wàn)級(jí)數(shù)據(jù)分頁(yè)代碼[修正下載地址]
在萬(wàn)級(jí)數(shù)據(jù)量下的分頁(yè)代碼2008-10-10
.NET 6開(kāi)發(fā)TodoList應(yīng)用之實(shí)現(xiàn)PUT請(qǐng)求
PUT請(qǐng)求本身其實(shí)可說(shuō)的并不多,過(guò)程也和創(chuàng)建基本類(lèi)似。這篇文章主要為大家介紹了.NET6實(shí)現(xiàn)PUT請(qǐng)求的示例詳解,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12
asp.net下獲取瀏覽器類(lèi)型的實(shí)現(xiàn)代碼
上次我需要判斷瀏覽器是IE還是FF,如果是FF那么頁(yè)面停止輸出。但方法寫(xiě)得不是很好,現(xiàn)在在書(shū)中看到了Page.Request.Browser屬性,這個(gè)屬性主要用來(lái)檢查當(dāng)前瀏覽器性能,看下我下面代碼的不同執(zhí)行結(jié)果。2009-09-09
Asp.net中處理一個(gè)站點(diǎn)不同Web應(yīng)用共享Session的問(wèn)題
Asp.net中處理一個(gè)站點(diǎn)不同Web應(yīng)用共享Session的問(wèn)題...2006-09-09
.NetCore手動(dòng)封裝日志組件的實(shí)現(xiàn)代碼
這篇文章主要介紹了.NetCore手動(dòng)封裝日志組件的實(shí)現(xiàn)代碼,封裝的目的是便于在項(xiàng)目里更加簡(jiǎn)單方便使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
在ASP.Net中實(shí)現(xiàn)RSA加密的方法
這篇文章介紹了在ASP.Net中實(shí)現(xiàn)RSA加密的方法,有需要的朋友可以參考一下2013-11-11

