日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net Core中IOC容器的使用

發(fā)布時間:2023/12/4 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net Core中IOC容器的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文由江北原創(chuàng)投稿,獨家授權(quán)技術(shù)在于分享(公眾號ID:sharecore),未經(jīng)許可,不得轉(zhuǎn)載。

作者:江北

打代碼之前先說一下幾個概念,那就是什么是IOC、DI、DIP

雖然網(wǎng)上講這些的已經(jīng)有很多了,我這里還是要再贅述一下

IOC容器就是一個工廠,負責(zé)創(chuàng)建對象的 IOC控制反轉(zhuǎn):只是把上端對下端的依賴,換成第三方容器決定 DI依賴注入:就是在構(gòu)造某個對象時,能將對象依賴的東西自動的初始化進去 正是因為要實現(xiàn)IOC,所以才誕生了DI的技術(shù)手段 DIP就是上層模塊不應(yīng)該依賴底層模塊,它們都應(yīng)該依賴于抽象,具體點是Service不應(yīng)該依賴于Repository,而應(yīng)該依賴于IRepository

.Net Core中自帶了輕量級的IOC的容器

依次是Transient、Scoped、Singleton

services.AddTransient<>():服務(wù)在每次請求時被創(chuàng)建,適合無狀態(tài)的服務(wù)

services.AddScoped<>():服務(wù)每個請求只創(chuàng)建一次

services.Singleton<>():單例,只創(chuàng)建一次,第一次被請求的時候被創(chuàng)建

code部分:

定義一個接口ICacheContext和一個實現(xiàn)類CacheContext

?

?假如我們現(xiàn)在想要使用CacheContext類中的方法,按照我們以前的思路肯定是:

//實例化 CacheContext context=new CacheContext(); //調(diào)用方法 context.method();

這就產(chǎn)生了依賴!我們要依賴于抽象不能依賴于具體實現(xiàn)細節(jié),這樣做:

//實例化 ICacheContext context=new CacheContext(); //調(diào)用方法 context.method();

接下來用IOC容器實現(xiàn),將對象交給IOC容器托管。

這樣之后可以使用構(gòu)造函數(shù)、屬性、方法進行注入

這里使用構(gòu)造函數(shù)注入,如下:

?

?接下來使用第三方IOC容器:Autofac

導(dǎo)包:Autofac與Autofac.Extensions.DependencyInjection

在Program中,加入如下代碼:

public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).UseServiceProviderFactory(new AutofacServiceProviderFactory())//配置UseServiceProviderFactory.ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});}

在Startup中加入一個方法:

public void ConfigureContainer(ContainerBuilder builder) {builder.RegisterType<CacheContext>().As<ICacheContext>(); }

還是一樣在Controller中使用構(gòu)造函數(shù)注入,和上面一樣

但是在真實的項目開發(fā)中不可能一個個的寫

我們可以通過反射加載程序集的強名稱,但是api層必須要對其引用

例如我這里api層引用了Icewo.BaseManage.MSSQLDB層

?在ConfigureContainer方法中添加如下代碼

var assemblysServicesNoInterfaces = Assembly.Load("Icewo.BaseManage.MSSQLDB");builder.RegisterAssemblyTypes(assemblysServicesNoInterfaces); Icewo.BaseManage.MSSQLDB層是沒有實現(xiàn)層的,也就是說他沒有接口層 如果是有接口層的話,方法又不一樣了 例如我這里有Business層和IBusiness層,如果api層直接對Business層進行引用,這就造成程序高度耦合。所以api層只引用IBusiness層=》DIP(依賴倒置)

?在ConfigureContainer中添加如下方法:

注意:你要拷貝Business.dll到api層的bin目錄下或者改一下輸出路徑,不然啟動的時候會報錯。

var basePath = Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath;var businessDllFile = Path.Combine(basePath, "Icewo.BaseManage.Business.dll");var assemblysBusiness = Assembly.LoadFrom(businessDllFile);builder.RegisterAssemblyTypes(assemblysBusiness).AsImplementedInterfaces().InstancePerDependency();

還是一樣在Controllers中以構(gòu)造函數(shù)注入的方式進行調(diào)用

水平有限,但是希望能幫到大家。

往期精彩回顧

  • .NETCore 實現(xiàn)容器化Docker與私有鏡像倉庫管理

  • 10張圖帶你深入理解Docker容器和鏡像

  • Linux容器技術(shù)原理和使用

?

點擊【在看】與好友一起分享

總結(jié)

以上是生活随笔為你收集整理的.Net Core中IOC容器的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。