Пример #1
0
        /// <summary>
        /// 获取 ServiceProvider
        /// </summary>
        /// <param name="useGlobalScope">是否使用全局唯一 ServiceScope 对象。
        /// <para>默认为 true,即使用全局唯一 ServiceScope。</para>
        /// <para>如果为 false,即使用线程内唯一 ServiceScope 对象</para>
        /// </param>
        /// <returns></returns>
        public static IServiceProvider GetIServiceProvider(bool useGlobalScope = true)
        {
            if (useGlobalScope)
            {
                if (GlobalIServiceProvider == null)
                {
                    //加锁确保唯一
                    lock (_globalIServiceProviderLock)
                    {
                        if (GlobalIServiceProvider == null)
                        {
                            //注意:BuildServiceProvider() 方法每次会生成不同的 ServiceProvider 对象!
                            GlobalIServiceProvider = GlobalServiceCollection.BuildServiceProvider();
                        }
                    }
                }
                return(GlobalIServiceProvider);
            }
            else
            {
                if (ThreadServiceScope == null)
                {
                    //加锁确保唯一
                    lock (_threadIServiceProviderLock)
                    {
                        if (ThreadServiceScope == null)
                        {
                            //注意:BuildServiceProvider() 方法每次会生成不同的 ServiceProvider 对象!
                            //GlobalIServiceProvider = GetServiceCollection().BuildServiceProvider();

                            var globalServiceProvider = GetIServiceProvider(true);

                            Thread.SetData(Thread.GetNamedDataSlot(SENPARC_DI_THREAD_SERVICE_Scope), globalServiceProvider.CreateScope());
                        }
                    }
                }
                return(ThreadServiceScope.ServiceProvider);
            }
        }
Пример #2
0
 /// <summary>
 /// 从 GlobalServiceCollection 重新 Build,生成新的 IServiceProvider
 /// </summary>
 /// <returns></returns>
 public static IServiceProvider GetServiceProvider()
 {
     return(GlobalServiceCollection.BuildServiceProvider());
 }