ASP.NET Core 2.0使用Autofac实现IOC依赖注入竟然能如此的优雅简便
初識ASP.NET Core的小伙伴一定會發現,其幾乎所有的項目依賴都是通過依賴注入方式進行鏈式串通的。這是因為其使用了依賴注入 (DI) 的軟件設計模式,代碼的設計是遵循著“高內聚、低耦合”的原則,使得各個類與類之間的關系依賴于接口,這樣做的目的是能更有利于項目代碼的維護與擴展。
?
Autofac
在進入主題之前咱們還是先來簡單的認識下鼎鼎大名的“Autofac”吧。那么何為Autofac呢,通俗的講就是一個開源的,且基于.NET Core、ASP.NET Core、.NET 4.5.1+等框架實現的控制反轉(IOC)類庫。通過Autofac可以在.NET Core、ASP.NET Core、.NET 4.5.1+等項目上很容易的實現依賴注入,代碼很容易就能達到“高內聚、低耦合”的原則。另外,Autofac的中文資料也很多,需要詳細了解的也可在網上自行查看。
Autofac官方網站:https://autofac.org/
?
背景
在我們大部分的項目中都會將代碼抽成多層,每層之間通過相互依賴串聯工作。在這里,我們將ASP.NET Core項目代碼抽成三層結構,分別為輸入輸出層(MVC項目)、業務層(類庫)、數據層(類庫),每層的功能描述如下:
1、Lezhima.Web:接受來自客戶端的請求,及服務端響應的出入口。由一個基于ASP.NET Core的MVC項目組成。
2、Lezhima.Core:根據請求做出相應的業務判斷,及調度上下游數據并計算,輸出相應的業務結果給調用者。由一個基于.NET Core的類庫組成。
3、Lezhima.Data:直接跟DB進行通訊交互,實現對DB的增、刪、改、查等操作。由一個基于.NET Core的類庫組成。
依賴關系:
基于上述中的三層代碼結構,我們可以清晰的看出Lezhima.Web做為項目出入口,在其需要時會調用Lezhima.Core類庫,并將業務交由Lezhima.Core庫處理,而Lezhima.Core類庫在其需要時會調用Lezhima.Data類庫操作DB。那么,它們之間的依懶關系應該是這樣子的:
1、Lezhima.Web同時依賴于Lezhima.Core與Lezhima.Data類庫。
2、Lezhima.Core依賴于Lezhima.Data類庫。
?
實現代碼
通過上面的介紹,我們清楚了三個分層之間的功能與依賴關系,那么接下來我們就分別來看看它們具體代碼及使用Autofac如何優雅的實現依賴注入吧。
1、首先在Lezhima.Web項目中通過NuGet管理器引用:Autofac、Autofac.Extensions.DependencyInjection兩個類庫。
2、我們先來看看Lezhima.Data層的代碼,首先定義一個名為“IRepository”接口,代碼如下:
3、在Lezhima.Data層再增加一個名為“Repository”類,實現“IRepository”接口,代碼如下:
?
4、在Lezhima.Core層再定義一個名為“IUserCore”接口,代碼如下:
?
5、在Lezhima.Core層再增加一個名為“UserCore”類,實現“IUserCore”接口,代碼如下:
?
6、在Lezhima.Web層增加一個名為“AccountController ”的控制器,代碼如下:
7、在Lezhima.Web層增加一個名為“Evolution”的類,用于繼承Autofac的Module類,實現上述三層之間的依賴關系注入,代碼如下:
8、在Lezhima.Web層的“Startup”類的“ConfigureServices”方法內注入即可,代碼如下:
??
總結
1、每層在調用時,通過在該類內聲明一個接口類型的屬性(變量),再通過Autofac構造涵數注入方式實現依賴注入并獲取到相應的類實例。
2、通過繼承Autofac的Module類,并在Load方法內重寫自已項目的類關系來實現注入業務。
3、Autofac注入有多種不同的生命周期類型,分別為InstancePerLifetimeScope、SingleInstance、InstancePerDependency等,各位在項目中按需選擇即可。
4、最后再通過在ASP.NET Core項目內的“Startup”類內將注入代碼類注冊到項目中就可正常使用了。
原文鏈接:https://www.cnblogs.com/Andre/p/9604759.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的ASP.NET Core 2.0使用Autofac实现IOC依赖注入竟然能如此的优雅简便的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于.NET Core是否应该支持WCF
- 下一篇: 实战中的asp.net core结合Co