zoukankan      html  css  js  c++  java
  • IoC:控制反转

    接口IIocHelper定义

        /// <summary>
        /// Ioc助手接口
        /// </summary>
        public interface IIocHelper : IDisposable
        {
            /// <summary>
            /// 容器
            /// </summary>
            object Container { get; }
    
            /// <summary>
            /// 注册接口
            /// </summary>
            /// <typeparam name="TService">接口类型</typeparam>
            /// <typeparam name="TImplementation">实现类型</typeparam>
            /// <param name="lifestyle">生命周期控制</param>
            void RegisterIoc<TService, TImplementation>(IocLifeStyle lifestyle)
                where TService : class
                where TImplementation : class, TService;
    
            /// <summary>
            /// 根据类型进行接口注册
            /// </summary>
            /// <param name="serviceType">服务类型</param>
            /// <param name="implementationType">实现类型</param>
            /// <param name="iocLifestyle">生命周期控制</param>
            void RegisterIoc(Type serviceType, Type implementationType, IocLifeStyle iocLifestyle);
    
    
    
    
            /// <summary>
            /// 根据接口类型进行注册
            /// </summary>
            /// <typeparam name="TService">服务类型</typeparam>
            /// <param name="funcImpl">实现函数</param>
            /// <param name="iocLifestyle">生命周期控制</param>
            void RegisterIoc<TService>(Func<TService> funcImpl, IocLifeStyle iocLifestyle) where TService:class;
    
    
            /// <summary>
            /// 注册接口,如果接口依赖于其它接口,并且在实现类的汇编级中有相关实现,则会自动注册相关接口
            /// </summary>
            /// <typeparam name="TService">接口类型</typeparam>
            /// <typeparam name="TImplementation">实现类型</typeparam>
            /// <param name="lifestyle">生命周期控制</param>
            void RegisterIocR<TService, TImplementation>(IocLifeStyle lifestyle)
                where TService : class
                where TImplementation : class, TService;
    
            /// <summary>
            /// 根据类型进行接口注册
            /// </summary>
            /// <param name="serviceType">服务类型</param>
            /// <param name="implementationType">实现类型</param>
            /// <param name="iocLifestyle">生命周期控制</param>
            void RegisterIocR(Type serviceType, Type implementationType, IocLifeStyle iocLifestyle);
    
    
            /// <summary>
            /// 获取实例
            /// </summary>
            /// <typeparam name="TInterface">接口类型</typeparam>
            /// <returns>接口实例</returns>
            TInterface GetInstance<TInterface>() 
                where TInterface : class;
    
            /// <summary>
            /// 获取类型注册信息
            /// </summary>
            /// <param name="interfaceTye">接口类型</param>
            /// <returns>注册信息</returns>
            IocRegistration GetRegistration(Type interfaceTye);
        }
    

     

    实现IocHelper定义

        public class IocHelper : IIocHelper, IDisposable
        {
            private Container _container;
            protected Dictionary<Type, IocRegistration> _typeRegistrationInfo = new Dictionary<Type, IocRegistration>();
    
            public IocHelper()
            {
                _container = new SimpleInjector.Container();
            }
    
            public object Container
            {
                get
                {
                    return _container;
                }
            }
    
            public void Dispose()
            {
                if (_container != null)
                {
                    _container.Dispose();
                    _container = null;
                }
            }
    
            public TInterface GetInstance<TInterface>() 
                where TInterface : class
            {
                 return _container.GetInstance<TInterface>();
            }
    
            public IocRegistration GetRegistration(Type serviceType)
            {
                if (_typeRegistrationInfo.ContainsKey(serviceType))
                {
                    return _typeRegistrationInfo[serviceType];
                }
                return null;
            }
    
            protected Lifestyle GetLifestyle(IocLifeStyle iocLifestyle)
            {
                Lifestyle lifeStyle = Lifestyle.Scoped;
                switch (iocLifestyle)
                {
                    case IocLifeStyle.Scoped:
                        lifeStyle = Lifestyle.Scoped;
                        break;
                    case IocLifeStyle.Singleton:
                        lifeStyle = Lifestyle.Singleton;
                        break;
                    case IocLifeStyle.Transient:
                        lifeStyle = Lifestyle.Transient;
                        break;
                    default:
                        throw new NotImplementedException(String.Format("Unknown lifestyle:{0}", Enum.GetName(typeof(IocLifeStyle), iocLifestyle)));
                }
                return lifeStyle;
            }
    
            public void RegisterIoc(Type serviceType,Type implementationType, IocLifeStyle iocLifestyle)
    
            {
                Lifestyle lifeStyle = GetLifestyle(iocLifestyle);
                var prevSettings = GetRegistration(serviceType);
                if (prevSettings == null || prevSettings.ImplementationType!=implementationType)
                {
                    _container.Register(serviceType, implementationType, lifeStyle);
                    _typeRegistrationInfo[serviceType] = new IocRegistration
                    {
                        Container = _container,
                        ImplementationType = implementationType,
                        LifeStyle = iocLifestyle
                    };
                }
            }
    
            public void RegisterIoc<TService>(Func<TService> funcImpl, IocLifeStyle iocLifestyle) where TService : class
            {
                Lifestyle lifeStyle = GetLifestyle(iocLifestyle);
                var reg = GetRegistration(typeof(TService));
                if (reg != null) return;
                _container.Register<TService>(funcImpl, lifeStyle);
                _typeRegistrationInfo[typeof(TService)] = new DependencyInjection.IocRegistration
                {
                    Container = _container,
                    LifeStyle = iocLifestyle,
                    ObjectCreator = funcImpl
                };
            }
    
            public void RegisterIoc<TService, TImplementation>(IocLifeStyle iocLifestyle) 
                where TService : class
                where TImplementation : class, TService
            {
                RegisterIoc(typeof(TService), typeof(TImplementation), iocLifestyle);
            }
    
            public void RegisterIocR(Type serviceType, Type implementationType, IocLifeStyle iocLifestyle)
            {
                var implClassConstructors = implementationType.GetConstructors(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
                var implAssembly = implementationType.Assembly;
                if (implClassConstructors == null || implClassConstructors.Length > 0)
                {
    
                    foreach (var implClassConstructor in implClassConstructors)
                    {
                        var paras = implClassConstructor.GetParameters();
    
                        foreach (var para in paras)
                        {
                            var t = para.ParameterType;
                            if (t.IsInterface)
                            {
                                var reg = GetRegistration(t);
                                if (reg != null) continue;
                                var matchedClassType = implAssembly.GetExportedTypes().FirstOrDefault(et =>
                                 et.IsClass && et.GetInterfaces() != null && et.GetInterfaces().FirstOrDefault(i1 => i1 == t) != null);
                                if (matchedClassType != null)
                                {
                                    RegisterIocR(t, matchedClassType, iocLifestyle);
                                }
                                else
                                {
                                    var allLoadedAssembly = System.AppDomain.CurrentDomain.GetAssemblies();
                                    
                                    foreach (var currentAssembly in allLoadedAssembly)
                                    {
                                        if (currentAssembly.IsDynamic || currentAssembly.GlobalAssemblyCache || currentAssembly.FullName.StartsWith("Microsoft",StringComparison.CurrentCultureIgnoreCase)) continue;
                                        matchedClassType = currentAssembly.GetExportedTypes().FirstOrDefault(et =>
                                                et.IsClass && et.GetInterfaces() != null && et.GetInterfaces().FirstOrDefault(i1 => i1 == t) != null);
                                        if (matchedClassType!=null)
                                        {
                                            RegisterIocR(t, matchedClassType, iocLifestyle);
                                            break;
                                        }
                                    }
                                    if (matchedClassType==null)
                                    {
                                        throw new InvalidOperationException(String.Format("Unable to register interface {0} in all assemblies while registering interface {1}", t.FullName,serviceType.FullName));
                                    }
                                }
                            }
                        }
    
                    }
                }
    
                RegisterIoc(serviceType, implementationType, iocLifestyle);
    
            }
    
            public void RegisterIocR<TService, TImplementation>(IocLifeStyle iocLifestyle)
                where TService : class
                where TImplementation : class, TService
            {
                RegisterIocR(typeof(TService), typeof(TImplementation), iocLifestyle);
            }
    
    
    
        }
    

      

    单例模式获取IocHelper对象

        public class IocFactory
        {
            private static IocHelper ioc = null;
    
            public static IIocHelper Instance
            {
                get
                {
                    return CreateIocHelper();
                }
            }
    
            private static object _objLock = new object();
    
            public static IIocHelper CreateIocHelper(string IocType = "")
            {
                if (ioc == null)
                {
                    lock (_objLock)
                    {
                        if (ioc == null)
                        {
                            if (string.IsNullOrEmpty(IocType))
                            {
                                ioc = new IocHelper();
                            }
                        }
                    }
                }
                return ioc;
            }
        }
    

      

    Global.asax.cs的Application_Start()中使用:

                IIocHelper ioc = IocFactory.Instance;
                var actualContainer = ioc.Container as SimpleInjector.Container;
                actualContainer.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
                var defaultLifeStyle = IocLifeStyle.Transient;
    
                ioc.RegisterIoc<ICouponService, CouponService>(defaultLifeStyle);
                //.......
    
                actualContainer.RegisterMvcControllers(Assembly.GetExecutingAssembly());
                actualContainer.RegisterMvcIntegratedFilterProvider();
                DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(actualContainer));
    

    其他类:

        /// <summary>
        /// LifeStyle
        /// </summary>
        public enum IocLifeStyle:Int32
        {
            /// <summary>
            /// Scoped
            /// </summary>
            Scoped = 0,
    
            /// <summary>
            /// Singleton
            /// </summary>
            Singleton = 1,
    
            /// <summary>
            /// Transient
            /// </summary>
            Transient = 2
        }
    
    
    
    
        
         /// <summary>
        /// Ioc注册信息
        /// </summary>
        public class IocRegistration
        {
            /// <summary>
            /// 生命周期类型
            /// </summary>
            public IocLifeStyle LifeStyle { get; set; }
            /// <summary>
            /// 实现类型
            /// </summary>
            public Type ImplementationType { get; set; }
            /// <summary>
            /// 容器
            /// </summary>
            public Object Container { get; set; }
            /// <summary>
            /// 对象创建方法
            /// </summary>
            public Object ObjectCreator { get; set; }
        }
    

      

     

  • 相关阅读:
    mysq 中 information_schema 库
    python mysql创建表
    Mysql 连接池
    mysql 事务、游标
    python 操作数据库1--连接、执行sql语句
    搭建自动化脚本运行环境
    快速定位XPATH
    Fiddler--Filters
    Fiddler--Composer
    Fiddler--AutoResponder
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/7576466.html
Copyright © 2011-2022 走看看