GetCallSite()
中,其实就是获取要解析对象的实例相关信息 。我们需要知道创建类型实例的时候使用哪种方式(比如我们的Person是使用委托的这种方式),其中也包括该对象创建的类型、创建工厂、生命周期类型 。RealizeService()
里 。根据不同类型创建方式和生命周期 , 判断如何创建对象,即对象存放位置 。关于结束释放前面咱们看了下关于作用域创建,在做用户获取对象的相关逻辑 。接下来我们来看一下三件套的最后一个步骤,释放逻辑相关的 。这个逻辑比较简单,上面咱们或多或少的也说过了一点,释放分为同步释放和异步释放两种情况,咱们看一下同步释放的相关实现[点击查看源码]
internal Dictionary<ServiceCacheKey, object> ResolvedServices { get; }internal object Sync => ResolvedServices;private bool _disposed;private List<object> _disposables;public void Dispose(){ List<object> toDispose = BeginDispose(); if (toDispose != null) { for (int i = toDispose.Count - 1; i >= 0; i--) { //模仿栈模式,最后创建的最先释放 if (toDispose[i] is IDisposable disposable) { //释放的正式实现了IDisposable接口的对象 disposable.Dispose(); } else { throw new InvalidOperationException(SR.Format(SR.AsyncDisposableServiceDispose, TypeNameHelper.GetTypeDisplayName(toDispose[i]))); } } }}private List<object> BeginDispose(){ //本质就是锁住当前存储对象的集合,不允许进行任何操作 lock (Sync) { //如果已经释放过了则直接返回 if (_disposed) { return null; } DependencyInjectionEventSource.Log.ScopeDisposed(RootProvider.GetHashCode(), ResolvedServices.Count, _disposables?.Count ?? 0); //先把释放标识设置了 _disposed = true; } //判断是否是根容器释放 if (IsRootScope && !RootProvider.IsDisposed()) { RootProvider.Dispose(); } return _disposables;}
推荐阅读
- asp.net core web 解决方案多项目模板制作打包总结
- ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写
- 上 学习ASP.NET Core Blazor编程系列六——新增图书
- Azure DevOps Pipelines部署.Net Core 应用到Kubernetes
- C语言小白刷题
- 记一次 .NET 某企业OA后端服务 卡死分析
- .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现
- .Net CLR异常简析
- 记一次 .NET 某电子病历 CPU 爆高分析
- .NET 7 RC 2 发布,倒计时一个月发布正式版