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