而解析ServiceCallSite实例的方法RealizeService(ServiceCallSite)则是在ServiceProviderEngine类中,看一下相关实现[点击查看源码]
public override Func<ServiceProviderEngineScope, object> RealizeService(ServiceCallSite callSite){ int callCount = 0; return scope => { //核心代码是Resolve方法,这里的scope则是ServiceProviderEngineScope //即我们上面通过CreateScope()创建的实例 var result = CallSiteRuntimeResolver.Instance.Resolve(callSite, scope); if (Interlocked.Increment(ref callCount) == 2) { _ = ThreadPool.UnsafeQueueUserWorkItem(_ => { try { _serviceProvider.ReplaceServiceAccessor(callSite, base.RealizeService(callSite)); } catch (Exception ex) { //省略掉非核心代码 } }, null); } return result; };}上面我们看到的RealizeService()方法返回的是一个委托,而调用这个委托的地方则是上面源码中看到的realizedService.Invoke(serviceProviderEngineScope),核心操作在CallSiteRuntimeResolver.Instance.Resolve()方法,Resolve方法的核心逻辑在VisitCallSite()方法,看一下它的实现方式[点击查看源码]
protected virtual TResult VisitCallSite(ServiceCallSite callSite, TArgument argument){ if (!_stackGuard.TryEnterOnCurrentStack()) { return _stackGuard.RunOnEmptyStack((c, a) => VisitCallSite(c, a), callSite, argument); } switch (callSite.Cache.Location) { //ServiceLifetime.Singleton单例情况 case CallSiteResultCacheLocation.Root: return VisitRootCache(callSite, argument); //ServiceLifetime.Scoped作用域情况,也就是咱们关注的情况 case CallSiteResultCacheLocation.Scope: return VisitScopeCache(callSite, argument); //ServiceLifetime.Transient瞬时情况 case CallSiteResultCacheLocation.Dispose: return VisitDisposeCache(callSite, argument); case CallSiteResultCacheLocation.None: return VisitNoCache(callSite, argument); default: throw new ArgumentOutOfRangeException(); }}
经验总结扩展阅读
- asp.net core web 解决方案多项目模板制作打包总结
- ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写
- 上 学习ASP.NET Core Blazor编程系列六——新增图书
- Azure DevOps Pipelines部署.Net Core 应用到Kubernetes
- 记一次 .NET 某企业OA后端服务 卡死分析
- .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现
- .Net CLR异常简析
- 记一次 .NET 某电子病历 CPU 爆高分析
- .NET 7 RC 2 发布,倒计时一个月发布正式版
- .NET MAUI 社区工具包 1.3版本发布
