细聊.Net Core中IServiceScope的工作方式( 六 )

而解析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();    }}

经验总结扩展阅读