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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(上)

發(fā)布時間:2023/12/4 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(上) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

06 | 作用域與對象釋放行為

作用域主要由 IServiceScope 這個接口來承載

對于實現(xiàn) IDisposable 類的實例的對象,容器會負責對其生命周期進行管理,使用完畢之后,他會釋放這些對象

實現(xiàn) IDisposable 接口類型的釋放:

  • 1、容器只會負責由其創(chuàng)建的對象,如果這個對象是自己創(chuàng)建出來并放到容器里的,容器不負責釋放這個對象

  • 2、在容器和子容器釋放時,容器才會去釋放這些對象,也就是說容器的生命周期與其創(chuàng)建的對象的生命周期是有對應關系的

兩點建議:

  • 1、在根容器,最好不要創(chuàng)建實現(xiàn)了 IDisposable 瞬時服務

  • 2、避免手動創(chuàng)建實現(xiàn)了 IDisposable 對象,然后塞到容器里面,應該盡可能地使用容器來管理我們對象的創(chuàng)建和釋放

演示代碼:
https://github.com/witskeeper/geektime/tree/master/samples/DependencyInjectionScopeAndDisposableDemo

先看一下服務

namespace DependencyInjectionScopeAndDisposableDemo.Services {public interface IOrderService{}public class DisposableOrderService : IOrderService, IDisposable{public void Dispose(){Console.WriteLine($"DisposableOrderService Disposed:{this.GetHashCode()}");}} }

首先定義 IOrderService

接著定義 IOrderService 的實現(xiàn) DisposableOrderService,并實現(xiàn)了 IDisposable 這個接口

在釋放的時候打印釋放信息,并輸出對象的 HashCode

接著是服務注冊(Startup)

services.AddTransient<IOrderService,DisposableOrderService>();

這里先注冊一個瞬時服務,將 IOrderService 注冊進去

然后看一下控制器(WeatherForecastController)

[HttpGet] public int Get([FromServices] IOrderService orderService,[FromServices] IOrderService orderService2) {return 1; }

這里 FromServices 獲取了兩次 IOrderService

這里不需要寫任何代碼對它進行操作,因為整個生命周期是由容器去管理的

啟動程序,輸出如下:

DisposableOrderService Disposed:10579059 DisposableOrderService Disposed:47945396

可以看出,執(zhí)行完畢之后,DisposableOrderService 會被釋放掉,并且兩個對象都會被釋放掉

兩個對象的 HashCode 不同

瞬時服務在每一次獲取的時候都會獲得一個新的對象

接著,添加一行代碼表示服務

[HttpGet] public int Get([FromServices] IOrderService orderService,[FromServices] IOrderService orderService2) {Console.WriteLine("接口請求處理結(jié)束");return 1; }

輸出一下,表示我們的接口已經(jīng)訪問完畢,看一下釋放時機在哪里

啟動程序,輸出如下:

接口請求處理結(jié)束 DisposableOrderService Disposed:35023218 DisposableOrderService Disposed:13943705

由此看出,接口請求處理結(jié)束后,才釋放對象

接下來看一下 Scoped 模式

服務注冊

services.AddScoped<IOrderService>(p => new DisposableOrderService());

控制器

[HttpGet] public int Get([FromServices] IOrderService orderService,[FromServices] IOrderService orderService2) {Console.WriteLine("=======1==========");// HttpContext.RequestServices// 是當前請求的一個根容器// 應用程序根容器的一個子容器// 每個請求會創(chuàng)建一個容器using (IServiceScope scope = HttpContext.RequestServices.CreateScope()){// 在這個子容器下面再創(chuàng)建一個子容器來獲取服務var service = scope.ServiceProvider.GetService<IOrderService>();}Console.WriteLine("=======2==========");Console.WriteLine("接口請求處理結(jié)束");return 1; }

啟動程序,輸出如下:

=======1========== DisposableOrderService Disposed:31307802 =======2========== 接口請求處理結(jié)束 DisposableOrderService Disposed:31614998

每次請求會獲得兩個釋放,意味著每創(chuàng)建一個 Scoped 的作用域,每個作用域內(nèi)可以是單例的

總結(jié)

以上是生活随笔為你收集整理的.NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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