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; }
    }

  

 

原文地址:https://www.cnblogs.com/panpanwelcome/p/7576466.html