导航

06-004 DependencyInjection 之 IServiceCallSite(2)

Posted on 2015-03-25 12:35  DotNet1010  阅读(100)  评论(0)    收藏  举报

 接着看一下 ServicePrivider 中的四个实现了IServiceCallSite的类:

private class EmptyIEnumerableCallSite : IServiceCallSite{}
private class TransientCallSite        : IServiceCallSite{}
private class ScopedCallSite           : IServiceCallSite{}
private class SingletonCallSite        : ScopedCallSite{}

 EmptyIEnumerableCallSite 代码如下:

 private class EmptyIEnumerableCallSite : IServiceCallSite
        {
            private readonly object _serviceInstance;
            private readonly Type _serviceType;

            public EmptyIEnumerableCallSite(Type serviceType, object serviceInstance)
            {
                _serviceType = serviceType;
                _serviceInstance = serviceInstance;	// _serviceInstance 是空数组
			}

            public object Invoke(ServiceProvider provider)
            {
                return _serviceInstance;
            }

            public Expression Build(Expression provider)
            {
                return Expression.Constant(_serviceInstance, _serviceType);
            }
        }

 调用的代码:

              //Empty: Array.CreateInstance(itemType, 0);
                object emptyIEnumerableOrNull = GetEmptyIEnumerableOrNull(serviceType);
                if (emptyIEnumerableOrNull != null)
                {
                    return new EmptyIEnumerableCallSite(serviceType, emptyIEnumerableOrNull);
                }

 TransientCallSite 代码如下:

        private class TransientCallSite : IServiceCallSite
        {
            private readonly IServiceCallSite _service;

            public TransientCallSite(IServiceCallSite service)
            {
                _service = service;
            }

            public object Invoke(ServiceProvider provider)
            {
	        //在返回对象前 把对象放到 _disposables 一个列表中 以便释放资源
		return provider.CaptureDisposable(_service.Invoke(provider));
            }

            public Expression Build(Expression provider)
            {
                return Expression.Call(
                    provider,
                    CaptureDisposableMethodInfo,
                    _service.Build(provider));
            }
        }

 调用的代码如下:

           IServiceCallSite serviceCallSite = service.CreateCallSite(this, callSiteChain);
            if (service.Lifecycle == LifecycleKind.Transient)
            {
                return new TransientCallSite(serviceCallSite);
            }
            else if (service.Lifecycle == LifecycleKind.Scoped)
            {
                return new ScopedCallSite(service, serviceCallSite);
            }
            else
            {
                return new SingletonCallSite(service, serviceCallSite);
            }

 ScopedCallSite 代码如下:

        private class ScopedCallSite : IServiceCallSite
        {
            private readonly IService _key;
            private readonly IServiceCallSite _serviceCallSite;

            public ScopedCallSite(IService key, IServiceCallSite serviceCallSite)
            {
				// 为什么多一个 key ? 因为有可能已经创建过了  需要先查找判断 
                _key = key;
                _serviceCallSite = serviceCallSite;
            }

            public virtual object Invoke(ServiceProvider provider)
            {
                object resolved;
                lock (provider._sync) //private readonly object _sync = new object();
				{
                    if (!provider._resolvedServices.TryGetValue(_key, out resolved))
                    {
						//找不到 这里需要调用  同样要考虑到资源的释放
                        resolved = provider.CaptureDisposable(_serviceCallSite.Invoke(provider));
						// 创建好后 还需要放到已经创建的列表中
                        provider._resolvedServices.Add(_key, resolved);
                    }
                }
                return resolved;
            }
//---------这列省略了 Build 方法 }

SingletonCallSite 继承了 ScopedCallSite 代码如下:

 private class SingletonCallSite : ScopedCallSite
        {
            public SingletonCallSite(IService key, IServiceCallSite serviceCallSite) : base(key, serviceCallSite)
            {
            }

            public override object Invoke(ServiceProvider provider)
            {
				// 所有的 Singleton 对应同一个 ServiceProvider
				// Scope 则不同 不同的范围对应的不一样 
				return base.Invoke(provider._root);
            }

            public override Expression Build(Expression provider)
            {
                return base.Build(Expression.Field(provider, "_root"));
            }
        }