网络营销技能大赛优秀作品,天津seo推广,网站策划500字,苏州做网站找哪家好06 | 作用域与对象释放行为作用域主要由 IServiceScope 这个接口来承载对于实现 IDisposable 类的实例的对象#xff0c;容器会负责对其生命周期进行管理#xff0c;使用完毕之后#xff0c;他会释放这些对象实现 IDisposable 接口类型的释放#xff1a;1、容器只会负责由其… 06 | 作用域与对象释放行为作用域主要由 IServiceScope 这个接口来承载对于实现 IDisposable 类的实例的对象容器会负责对其生命周期进行管理使用完毕之后他会释放这些对象实现 IDisposable 接口类型的释放1、容器只会负责由其创建的对象如果这个对象是自己创建出来并放到容器里的容器不负责释放这个对象2、在容器和子容器释放时容器才会去释放这些对象也就是说容器的生命周期与其创建的对象的生命周期是有对应关系的两点建议1、在根容器最好不要创建实现了 IDisposable 瞬时服务2、避免手动创建实现了 IDisposable 对象然后塞到容器里面应该尽可能地使用容器来管理我们对象的创建和释放演示代码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 的实现 DisposableOrderService并实现了 IDisposable 这个接口在释放的时候打印释放信息并输出对象的 HashCode接着是服务注册Startupservices.AddTransientIOrderService,DisposableOrderService();这里先注册一个瞬时服务将 IOrderService 注册进去然后看一下控制器WeatherForecastController[HttpGet]
public int Get([FromServices] IOrderService orderService,[FromServices] IOrderService orderService2)
{return 1;
}这里 FromServices 获取了两次 IOrderService这里不需要写任何代码对它进行操作因为整个生命周期是由容器去管理的启动程序输出如下DisposableOrderService Disposed:10579059
DisposableOrderService Disposed:47945396可以看出执行完毕之后DisposableOrderService 会被释放掉并且两个对象都会被释放掉两个对象的 HashCode 不同瞬时服务在每一次获取的时候都会获得一个新的对象接着添加一行代码表示服务[HttpGet]
public int Get([FromServices] IOrderService orderService,[FromServices] IOrderService orderService2)
{Console.WriteLine(接口请求处理结束);return 1;
}输出一下表示我们的接口已经访问完毕看一下释放时机在哪里启动程序输出如下接口请求处理结束
DisposableOrderService Disposed:35023218
DisposableOrderService Disposed:13943705由此看出接口请求处理结束后才释放对象接下来看一下 Scoped 模式服务注册services.AddScopedIOrderService(p new DisposableOrderService());控制器[HttpGet]
public int Get([FromServices] IOrderService orderService,[FromServices] IOrderService orderService2)
{Console.WriteLine(1);// HttpContext.RequestServices// 是当前请求的一个根容器// 应用程序根容器的一个子容器// 每个请求会创建一个容器using (IServiceScope scope HttpContext.RequestServices.CreateScope()){// 在这个子容器下面再创建一个子容器来获取服务var service scope.ServiceProvider.GetServiceIOrderService();}Console.WriteLine(2);Console.WriteLine(接口请求处理结束);return 1;
}启动程序输出如下1
DisposableOrderService Disposed:31307802
2
接口请求处理结束
DisposableOrderService Disposed:31614998每次请求会获得两个释放意味着每创建一个 Scoped 的作用域每个作用域内可以是单例的