订阅号栏目里做微网站,移动端响应式网站怎么做,网页制作基本代码,在线制作diy电子印章06 | 作用域与对象释放行为接下来#xff0c;把服务切换为单例模式#xff0c;通过工厂的方式services.AddSingletonIOrderService(p new DisposableOrderService());启动程序#xff0c;输出如下#xff1a;1
2
接口请求处理结束可以看到代码实际上不会被释放… 06 | 作用域与对象释放行为接下来把服务切换为单例模式通过工厂的方式services.AddSingletonIOrderService(p new DisposableOrderService());启动程序输出如下1
2
接口请求处理结束可以看到代码实际上不会被释放如果切换为瞬时模式通过工厂的方式services.AddTransientIOrderService(p new DisposableOrderService());启动程序输出如下1
DisposableOrderService Disposed:12021664
DisposableOrderService Disposed:32106157
2
接口请求处理结束
DisposableOrderService Disposed:3165221
DisposableOrderService Disposed:13048313这里可以看到获取四个服务并且释放掉接下来把服务调整为自己创建并注册进去var service new DisposableOrderService();
services.AddSingletonIOrderService(service);同样我们也不会得到释放的输出也就是说通过这种方式注册容器不会管理对象的生命周期如何识别这个区别呢在控制器中注入 IHostApplicationLifetime 接口这个接口的作用是用来管理整个应用程序的生命周期它有一个方法 StopApplication也就是说它可以把整个应用程序关掉接着通过手工关掉的方式看一下应用程序关闭时会不会把单例对象释放掉[HttpGet]
public int Get([FromServices] IOrderService orderService,[FromServices] IOrderService orderService2,[FromServices]IHostApplicationLifetime hostApplicationLifetime,[FromQuery]bool stop false)
{Console.WriteLine(1);// HttpContext.RequestServices// 是当前请求的一个根容器// 应用程序根容器的一个子容器// 每个请求会创建一个容器using (IServiceScope scope HttpContext.RequestServices.CreateScope()){// 在这个子容器下面再创建一个子容器来获取服务var service scope.ServiceProvider.GetServiceIOrderService();var service2 scope.ServiceProvider.GetServiceIOrderService();}Console.WriteLine(2);if (stop){hostApplicationLifetime.StopApplication();}Console.WriteLine(接口请求处理结束);return 1;
}首先用自己创建对象的方式var service new DisposableOrderService();
services.AddSingletonIOrderService(service);启动程序输入 ?stoptruehttps://localhost:5001/weatherforecast?stoptrue输出如下...
DependencyInjectionScopeAndDisposableDemo.exe (进程 16884)已退出代码为 0。
要在调试停止时自动关闭控制台请启用“工具”-“选项”-“调试”-“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .如果单例由容器来管理切换回普通注册方式services.AddSingletonIOrderService, DisposableOrderService();启动程序输入 ?stoptruehttps://localhost:5001/weatherforecast?stoptrue输出如下Application is shutting down...
接口请求处理结束
DisposableOrderService Disposed:23399238对象释放应用程序退出这里说明单例的服务都是注册在根容器里面根容器的释放意味着需要在整个应用程序退出时释放这个时候它会释放自己所管理的所有的 IDisposable 的对象这里面有一个非常需要注意的坑假如把服务注册成瞬时的services.AddTransientIOrderService, DisposableOrderService();然后又在根容器里面去获取这个对象var s app.ApplicationServices.GetServiceIOrderService();这意味着在根容器去持续的创建 IOrderService但是由于根容器只会在应用程序整个退出时回收也就意味着这些对象会一直积累在应用程序内调整控制器不获取 IOrderService[HttpGet]
public int Get([FromServices]IHostApplicationLifetime hostApplicationLifetime,[FromQuery]bool stop false)
{if (stop){hostApplicationLifetime.StopApplication();}return 1;
}仅仅在根容器获取一次var s app.ApplicationServices.GetServiceIOrderService();这样运行起来每次请求点击刷新的话整个输出是不会有内容的因为我们没有在子容器里面去获取对象但实际上当我们退出的时候会发现确实有一个实例被释放掉了DisposableOrderService Disposed:7511460也就是说实现了 IDisposable 接口的服务如果时注册瞬时的又在根容器去做操作它会一直保持到应用程序退出的时候才能够被回收掉