【19】ASP.NET Core 依賴注入

2021-02-21 角落的白板報
ASP.NET Core 依賴注入

在這個視頻中,我們將通過一個例子詳細討論依賴注入。

HomeController

public class HomeController : Controller
{
private IStudentRepository _studentRepository;

//使用構造函數注入的方式注入IStudentRepository
public HomeController(IStudentRepository studentRepository)
{
_studentRepository = studentRepository;
}


//返回學生的名字
public string Index()
{
return _studentRepository.GetStudent(1).Name;
}
}

注意事項 :

HomeController依賴於IStudentRepository來 查詢 Student 數據。

我們使用構造函數將IStudentRepository實例注入HomeController,而不是HomeController對IStudentRepository接口創建新的實例化。

這稱為構造函數注入,因為我們使用構造函數來注入依賴項。

請注意,我們將注入的依賴項分配給只讀欄位readonly。這是一個很好的做法,因為它可以防止在方法中誤操作地為其分配另一個值,比如 null。

此時,如果我們運行項目,則會收到以下錯誤:

InvalidOperationException: Unable to resolve service for type 'StudentManagement.Model.IStudentRepository'
while attempting to activate 'StudentManagement.Controllers.HomeController'.

IStudentRepository可能有多個實現。在我們的項目中,我們只有一個實現,那就是MockStudentRepository

顧名思義,MockStudentRepository使用內存中的學生模擬數據。

在我們即將發布的視頻中,我們將討論為IStudentRepository提供另一個實現,該實現從 SQL Server 資料庫中查詢學生數據。

現在,讓我們使用MockStudentRepository。

要修復 InvalidOperationException 錯誤,我們需要在 ASP.NET Core 中使用依賴注入容器註冊MockStudentRepository類。

我們在 Startup 類的 ConfigureServices()方法中執行此操作

使用 ASP.NET Core 依賴注入容器註冊服務:

ASP.NET Core 提供以下 3 種方法來使用依賴項注入容器註冊服務。我們使用的方法決定了註冊服務的生命周期。

AddSingleton()

AddSingleton()方法創建一個Singleton服務。首次請求時會創建Singleton服務。然後,所有後續請求都使用相同的實例。通常,每個應用程式只創建一次Singleton服務,並且在整個應用程式生命周期中使用該單個實例。

AddTransient()

AddTransient() 方法可以稱作:暫時性模式,會創建一個 Transient 服務。每次請求時,都會創建一個新的 Transient 服務實例,通常,在一些泛型的場景中使用。如:

Microsoft.Extensions.Options.IConfigureOptions<T>;

AddScoped()

AddScoped()方法創建一個 Scoped 服務。在我們發起的每個請求中都會創建一個新的 Scoped 服務實例。例如,在 Web 應用程式中,它為每個 http 請求創建 1 個實例,但在同一 Web 請求中的其他服務在調用這個請求的時候,都會使用相同的實例。注意,它在一個客戶端請求中是相同的,但在多個客戶端請求中是不同的。

請不要擔心,如果這一點有點令人困惑。我們將在本系列即將發布的視頻中好好單獨講這三種方法。

現在,要修復 InvalidOperationException 錯誤,讓我們使用AddSingleton()向 ASP.NET Core 依賴注入容器註冊MockStudentRepository類方法如下圖所示。

所以在此代碼中,如果有人調用IStudentRepository,將調用MockStudentRepository的實例服務。

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<IStudentRepository, MockStudentRepository>();
}

在這一點上,您可能在想,為什麼我們必須做這一切。為什麼我們不能使用 new 關鍵字在 HomeController 中簡單地創建MockStudentRepository類的實例,如下所示。

public class HomeController : Controller
{
private readonly IStudentRepository _studentRepository;

//使用構造函數注入的方式注入IStudentRepository
public HomeController(IStudentRepository studentRepository)
{
_studentRepository = new MockStudentRepository();
}

//返回學生的名字
public string Index()
{
return _studentRepository.GetStudent(1).Name;
}
}

這使HomeController與MockStudentRepository緊密耦合。 稍後如果我們為IStudentRepository 提供新的實現,並且如果我們想要使用新的實現而不是MockStudentRepository,我們必須更改 HomeController 中的代碼。您可能會想,這只是一行代碼更改,所以這並不難。

那麼,如果我們在我們的應用程式中的 50 個其他控制器中使用了這個MockStudentRepository呢? 所有 50 個控制器中的代碼都必須更改。這不僅無聊而且容易出錯。

簡而言之,使用 new 關鍵字創建依賴關係的實例會產生緊密耦合,因此您的應用程式將很難更改。通過依賴注入,我們不會有這種緊密耦合。

使用依賴注入,即使我們在我們的應用程式中的 50 個其他控制器中使用了MockStudentRepository,如果我們想用不同的實現交換它,我們只需要在 Startup.cs 文件中更改以下一行代碼。請注意,我們現在使用DatabaseStudentRepository而不是MockStudentRepository。

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<IStudentRepository, DatabaseStudentRepository>();
}

這樣帶來的效果是單元測試也變得更加容易,因為我們可以通過依賴注入輕鬆地交換依賴項。 如果這有點令人困惑,請不要擔心。我們將在即將發布的視頻中為IStudentRepository提供不同的實現。此新實現將從 SQL Server 資料庫中查詢數據。然後,我們將使用DatabaseStudentRepository實現替換MockStudentRepository實現。那個時候,您將了解依賴注入提供的功能和靈活性。

如果您覺得我的文章質量還不錯,歡迎打賞,也可以訂閱我的視頻哦

未得到授權不得擅自轉載本文內容,52abp.com保留版權

文字版目錄:https://www.52abp.com/Wiki/mvc/latest/1.Intro 

交流QQ群:952387474《微軟MVP帶你學ASP.NET CORE》

視頻課程: https://ke.qq.com/course/392589?tuin=2522cdf3 



相關焦點

  • 簡明 ASP.NET Core 手冊
    你將從零開始,完整地構建一個 待辦事項(to-do) 應用,同時了解以下內容:MVC (Model-View-Controller) 模式的基本內容前端代碼(HTML, CSS, JavaScript)怎樣與後端代碼交互什麼是依賴注入以及它的實用之處如何進行資料庫的讀寫操作如何添加 登錄、註冊功能,以及如何提升安全性
  • asp.net core 使用 TestServer 來做集成測試
    asp.net core 使用 TestServer 來做集成測試Intro之前我的項目裡的集成測試是隨機一個埠,每次都真實的啟動一個 WebServer,之前也有看到過微軟文檔上 TestServer 的介紹,當時沒仔細看過以為差不多就沒用,一直是啟動了一個真正的
  • asp.net core 5.0 中的 JsonConsole
    asp.net core 5.0 中的 JsonConsoleIntroasp.net core 5.0 中日誌新增了 JsonConsole,還是輸出日誌到 Console,但是會應用 Json 格式的一個 Formatter 把日誌格式化成 json 再輸出到控制臺
  • ASP.NET Core Identity Hands On(2)——註冊、登錄、Claim
    如果你熟悉 asp.net core ,那我猜你可能已經想到了沒錯 Options 就是 Di中的 Options在起作用。claim 的基本組成是 type和value,上面票據中左側的就是type右面就是value在 .net core 基礎類庫中是含有Claim的實現類的,它的位置是System.Security.Claims.Claim我們看一個真實的claim的例子{  "sub": "1234567890",  "name": "John Doe
  • ASP.NET Core 和 Blazor 更新 - OSCHINA - 中文開源技術交流社區
    GRPC 支持 CallCredentials此版增加了對 CallCredware 的支持,允許與現有的庫(如 Grpc.Auth)之間的互操作性,這些庫依賴 CallCredwarecalls-deadline-exceededmessages-sentmessages-receivedcalls-unimplemented詳情請見發布說明:https://devblogs.microsoft.com/aspnet/asp-net-core-and-blazor-updates-in-net-core
  • ASP.NET Core 3.1中HTTPS的配置
    HTTPS重定向中間件在asp.net中,默認情況下啟用https。其中HttpsRedirection中間件類提供強制執行從http到https重定向。啟動時會使用UseHttpsRedirection擴展方法來強制執行此操作。默認情況下,該擴展方法發出307臨時重定向響應。然後,使用配置的https埠指定重定向端點。
  • [譯]ASP.NET Core Web API 中使用Oracle資料庫和Dapper看這篇就夠了
    它需要訪問配置中的資料庫連接串,因此我們在構造函數中注入IConfiguration。所以,我們已經準備好使用配置對象了。除此之外,我們還有GetConnection()方法,該方法將從appsettings.json獲取連接字符串,並將其提供給OracleConnection以創建連接並最終返回連接。
  • 【Python】建立gRPC服務端與.Net Core 客戶端
    由於需要接入其他平臺的OAuth 2.0,還要提供RESTful API獲取VMware vSphere的數據,這塊內容,.net core我更熟悉,所以鎖定ASP.NET Core,通過上兩篇,我們知道這裡只能通過python去獲取數據了,那麼我面臨的問題就是python與.net core的數據通信:方法一:使用Python的web
  • 在離線環境中發布.NET Core至Windows Server 2008
    看了下官方給出的發布教程感覺挺詳細的了(https://docs.asp.net/en/latest/publishing/iis.html),不過畢竟離線環境還是挺麻煩的,直覺告訴我發布過程中會遇到么蛾子。果然就遇到問題了,不過解決起來都很簡單。這裡做個記錄順便分享下,希望對有類似需求的同學有所幫助。
  • dotNET Core 3.X 依賴注入
    如果說在之前的 dotNET 版本中,依賴注入還是個比較新鮮的東西,那麼在 dotNET Core 中已經是隨處可見了,可以說整個 dotNET Core 的框架是構建在依賴注入框架之上。本文說說對 dotNET Core 中依賴注入的理解。
  • 在ASP.NET Core中使用Angular2,以及與Angular2的Token base身份認證
    注意:本文章屬於Step by step + Code Sample教程,且篇幅較長,建議下載本Sample並跟著本文進度自己重做一遍本例,下載完整代碼並分析代碼結構才有意義,下載地址:How to authorization Angular 2 app with asp.net core web api
  • 如何實現Asp與Asp.Net共享Session
    > 語言 > 關鍵詞 > 最新資訊 > 正文 如何實現Asp與Asp.Net共享Session 在.net
  • .NET Core 學習資料精選:入門
    第一篇:.NET Core 學習資料精選:入門介紹.NET歷史、開源之路、基礎、路由、依賴注入、HttpContext、cookie|session、HttpClient、gRPC、單元測試、發布部署等等。
  • .net core+Spring Cloud學習之路 一
    言歸正傳,在今早發現張隊在元旦前的博客「年末展望:Oracle 對 JDK收費和.NET Core 給我們的機遇」,說明了以後.net core會越來越好,而我本人在2017年的時候開始接觸過.net core的時候,就沒有放棄過對.net core的學習,現在覺得微服務是個不錯的方向,而自己也在學習這塊的東西,所以寫個博客記錄一下自己的學習的筆記。
  • ASP.Net安裝簡明手冊
    MDAC2.6Beta22、軟體下載=====================·MDAC2.7(5.03MB)https://www.microsoft.com/data/download_270RTM.htm·FullSDKDownload(131MB)https://download.microsoft.com/download/.netframesdk
  • ASP.NET Core開發者成長路線圖
    #Entity FrameworkASP.NET CoreSQL基礎知識2、通用開發技能學習GIT, 在GitHub中創建開源項目掌握HTTP(S)協議, 及其請求方法(GET, POST, PUT, PATCH, DELETE, OPTIONS)3、依賴注入
  • Java Web系列:Spring依賴注入基礎
    Spring的基礎組件如下圖所示:從圖中可以看出,開始的模塊只有從core\beans\aop\context四個組件,後來添加了context-support【1.2】擴展模塊、expression【3.0】擴展模塊和beans-groovy【4.0】擴展模塊。
  • 自學MVC看這裡——全網最全ASP.NET MVC 教程匯總
    [ASP.NET MVC 小牛之路]01 - 理解MVC模式[ASP.NET MVC 小牛之路]02 - C#知識點提要[ASP.NET MVC 小牛之路]03 - Razor語法[ASP.NET MVC 小牛之路]04 - 依賴注入(DI)和Ninject[ASP.NET MVC 小牛之路]05 - 使用 Ninject
  • Github上優秀的.NET Core項目
    Grace - Grace是一款功能豐富的依賴注入容器,其設計考慮了易用性和性能。Inyector - AspNetCore的依賴注入自動化。Lamar - 快速的IOC工具庫。LightInject - 超輕量級IoC容器。SimpleInjector - 簡單,靈活,快速的依賴注入庫。
  • 目前中國網站服務端開發主要有PHP、asp.net、Java三種語言
    通過各招聘網站招聘程式設計師的類型統計得出結果是目前中國網站服務端開發主要有PHP、asp.net、Java三種語言,其他佔少數有潛力有C#,C++等,而Python也開始被開發者使用在服務端開發。從招聘的數據信息顯示,PHP編程開發主要集中在中小網站,個人站點,個人博客等開發,而政府網站更喜歡asp.net開發,Java則主要在電商,支付系統,安全數據的等方面有優勢。