修正Assembly为内存程序集是读取Location出错的问题
nnhy authored at 2012-05-16 14:12:11
9.98 KiB
X
//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Collections.Specialized;
//using System.ComponentModel.Design;
//using NewLife.Configuration;
//using NewLife.Log;
//using NewLife.Reflection;

//namespace NewLife.Model
//{
//    /// <summary>
//    /// 服务对象提供者,优先查找从构造函数传入的外部提供者,然后是全局的Current,最后才是当前提供者。
//    /// 支持枚举提供者内部注册的服务类型。
//    /// </summary>
//    public class ServiceProvider : IServiceProvider, IEnumerable<Type>
//    {
//        #region 构造
//        IServiceProvider _provider;

//        /// <summary>
//        /// 实例化
//        /// </summary>
//        public ServiceProvider() { LoadConfig(); }

//        /// <summary>
//        /// 通过指定一个基础提供者来实例化一个新的提供者,优先基础提供者
//        /// </summary>
//        /// <param name="provider"></param>
//        public ServiceProvider(IServiceProvider provider) : this() { _provider = provider; }
//        #endregion

//        #region 静态方法
//        /// <summary>
//        /// 获取服务对象的泛型实现,能够层层深入,处理无限层嵌套的服务提供者
//        /// </summary>
//        /// <typeparam name="TService"></typeparam>
//        /// <param name="provider"></param>
//        /// <returns></returns>
//        public static TService GetService<TService>(IServiceProvider provider)
//        {
//            if (provider == null) return default(TService);

//            //Object obj = provider.GetService(typeof(TService));
//            //if (obj != null) return (TService)obj;

//            //// 递归处理内层服务提供者。不知道会不会因为服务提供者相互嵌套而造成死循环
//            //IServiceProvider isp = provider.GetService(typeof(IServiceProvider)) as IServiceProvider;
//            //return isp == null ? default(TService) : GetService<TService>(isp);

//            return (TService)GetService(provider, typeof(TService));
//        }

//        [ThreadStatic]
//        private static List<IServiceProvider> sps;
//        /// <summary>
//        /// 获取服务对象,能够层层深入,处理无限层嵌套的服务提供者
//        /// </summary>
//        /// <param name="provider"></param>
//        /// <param name="serviceType"></param>
//        /// <returns></returns>
//        public static Object GetService(IServiceProvider provider, Type serviceType)
//        {
//            if (provider == null) return null;
//            if (serviceType == null) throw new ArgumentNullException("serviceType");

//            if (serviceType == typeof(IServiceProvider)) return provider;

//            // 通过线程安全(线程静态)的sps,来测底的避免相互嵌套形成死循环
//            // 如果sps不为空,表明当前线程正处于GetService中,不允许进入!
//            if (sps != null) return null;

//            try
//            {
//                // 采用循环处理,避免因为服务提供者相互嵌套而导致死循环
//                sps = new List<IServiceProvider>();
//                sps.Add(provider);
//                for (int i = 0; i < sps.Count; i++)
//                {
//                    IServiceProvider sp = sps[i];

//                    Object obj = provider.GetService(serviceType);
//                    if (obj != null) return obj;

//                    sp = provider.GetService(typeof(IServiceProvider)) as IServiceProvider;
//                    if (sp != null && !sps.Contains(sp)) sps.Add(sp);
//                }

//                return null;
//            }
//            finally { sps = null; }
//        }
//        #endregion

//        #region 默认提供者
//        private static IServiceProvider _Current;
//        /// <summary>默认服务对象提供者</summary>
//        public static IServiceProvider Current
//        {
//            get
//            {
//                if (_Current == null)
//                {
//                    // 从配置文件那默认提供者
//                    String name = Config.GetConfig<String>("NewLife.ServiceProvider");
//                    if (!String.IsNullOrEmpty(name))
//                    {
//                        Type type = TypeX.GetType(name);
//                        if (type != null && typeof(IServiceProvider).IsAssignableFrom(type))
//                        {
//                            _Current = TypeX.CreateInstance(type) as IServiceProvider;

//                            if (type != typeof(ServiceProvider)) _Current = new ServiceProvider(_Current);
//                        }
//                    }
//                    if (_Current == null) _Current = new ServiceProvider();
//                }
//                return _Current;
//            }
//            set { _Current = value; }
//        }

//        /// <summary>
//        /// 使用默认提供者获取服务对象的泛型实现
//        /// </summary>
//        /// <typeparam name="TService"></typeparam>
//        /// <returns></returns>
//        public static TService GetCurrentService<TService>()
//        {
//            return GetService<TService>(Current);
//        }
//        #endregion

//        #region 注册
//        // 非常需要一个线程安全,而又有很高性能的字典
//        private IDictionary<Type, Object> dic = new Dictionary<Type, Object>();
//        /// <summary>
//        /// 注册服务对象
//        /// </summary>
//        /// <param name="serviceType"></param>
//        /// <param name="obj"></param>
//        void Register(Type serviceType, Object obj)
//        {
//            if (serviceType == null) throw new ArgumentNullException("serviceType");

//            lock (dic)
//            {
//                if (obj != null)
//                {
//                    if (dic.ContainsKey(serviceType))
//                        dic[serviceType] = obj;
//                    else
//                        dic.Add(serviceType, obj);
//                }
//                else
//                {
//                    if (dic.ContainsKey(serviceType)) dic.Remove(serviceType);
//                }
//            }
//        }

//        /// <summary>
//        /// 取消注册服务对象
//        /// </summary>
//        /// <param name="serviceType"></param>
//        void UnRegister(Type serviceType)
//        {
//            if (serviceType == null) throw new ArgumentNullException("serviceType");

//            Register(serviceType, null);
//        }

//        void LoadConfig()
//        {
//            var ps = Config.GetConfigByPrefix("NewLife.ServiceProvider_");
//            if (ps == null || ps.Count < 1) return;

//            foreach (String item in ps.Keys)
//            {
//                try
//                {
//                    Type serviceType = TypeX.GetType(item);

//                    Type objType = null;
//                    String typeName = ps[item];
//                    if (!String.IsNullOrEmpty(typeName)) objType = TypeX.GetType(typeName);

//                    Register(serviceType, objType == null ? null : TypeX.CreateInstance(objType));
//                }
//                catch (Exception ex)
//                {
//                    XTrace.WriteException(ex);
//                }
//            }
//        }
//        #endregion

//        #region IServiceProvider 成员
//        /// <summary>
//        /// 获取服务对象
//        /// </summary>
//        /// <param name="serviceType"></param>
//        /// <returns></returns>
//        public virtual object GetService(Type serviceType)
//        {
//            if (serviceType == null) throw new ArgumentNullException("serviceType");

//            if (serviceType == typeof(IServiceProvider)) return this;

//            if (_provider != null)
//            {
//                // 调用静态GetService,避免死循环
//                Object obj = GetService(_provider, serviceType);
//                if (obj != null) return obj;
//            }

//            // 内部列表
//            {
//                Object obj = null;
//                if (dic.TryGetValue(serviceType, out obj)) return obj;
//            }

//            // 如果当前类不是ServiceProvider,则采用NewLife.ServiceProvider
//            if (this != Current && _provider != Current)
//            {
//                Object obj = GetService(Current, serviceType);
//                if (obj != null) return obj;
//            }

//            if (serviceType == typeof(ITypeDiscoveryService)) return new TypeDiscoveryService();
//            if (serviceType == typeof(ITypeResolutionService)) return new TypeResolutionService();

//            return null;
//        }

//        /// <summary>
//        /// 获取服务对象的泛型实现
//        /// </summary>
//        /// <typeparam name="TService"></typeparam>
//        /// <returns></returns>
//        public TService GetService<TService>()
//        {
//            Object obj = GetService(typeof(TService));
//            if (obj == null) return default(TService);
//            return (TService)obj;
//        }
//        #endregion

//        #region IEnumerable<Type> 成员
//        /// <summary>
//        /// 获取迭代器
//        /// </summary>
//        /// <returns></returns>
//        IEnumerator<Type> IEnumerable<Type>.GetEnumerator()
//        {
//            return dic.Keys.GetEnumerator();
//        }
//        #endregion

//        #region IEnumerable 成员
//        /// <summary>
//        /// 获取迭代器
//        /// </summary>
//        /// <returns></returns>
//        IEnumerator IEnumerable.GetEnumerator()
//        {
//            return (this as IEnumerable<Type>).GetEnumerator();
//        }
//        #endregion
//    }
//}