C# 如何实现控制反转(依赖注入)

来源:互联网 发布:ppt批量导入照片mac 编辑:程序博客网 时间:2024/06/10 13:38

控制反转 优点:

1、扩展时代码修改最小化。
2、组件可热插拔。
3、可配置性强。

控制反转原理,这里不介绍网上多多。请查看百度控制反转原理,大家都用过实例对象工厂模式如下:

  /// <summary>        /// 系统配置光雷达厂家类型        /// </summary>        /// <returns></returns>        public static string SysLidarType()         {                try                {                    string strlidartype = System.Configuration.ConfigurationManager.AppSettings["SysLidarType"].ToString();                    return strlidartype;                }                catch (Exception ex )                {                   throw ex;                }        }              /// <summary>        ///获取系统配置激光雷达对象实例        /// </summary>        /// <returns></returns>        public static ReadLidarDataBase GetReadLidarDataInstance()        {                      string syslidartypestr = SysLidarType();            switch (syslidartypestr)            {                case "LidarData_ZKGD"://中科光电激光雷达                    return new LidarData_ZKGD();                case "LidarData_LD"://蓝盾激光雷达                    return new LidarData_LD();                default:                    return new LidarData_LD();            }         }        
以上代码是Web.config 配置那个类型字符串后,来判断生成对应对角实例。没有完全意思的实现代码解耦,如添加一个新的子类是还要在GetReadLidarDataInstance方法中添加代码。为解决以上两个问题,我们采用.Net 中的反射技术来实现控制反转。以下用.Net 中的反射技术,实现可配置生成对象实例,并以单例模式记录到容器列表中.
        /// <summary>        /// 激光雷达数据解析类列表        /// </summary>        public static Dictionary<Type, object> Readlidardata = new Dictionary<Type, object>();        /// <summary>        ///获取系统配置激光雷达对象实例        /// </summary>        /// <returns></returns>        public static ReadLidarDataBase GetReadLidarDataInstance()        {            ReadLidarDataBase ReadLidarInstance = null;            Type lidartype = Type.GetType(SysLidarType());            if (!Readlidardata.ContainsKey(lidartype))            {                ReadLidarInstance = (ReadLidarDataBase)Activator.CreateInstance(lidartype, null);                Readlidardata.Add(lidartype, ReadLidarInstance);            }            else            {                ReadLidarInstance = (ReadLidarDataBase)Readlidardata[lidartype];            }            return ReadLidarInstance;            //    string syslidartypestr = SysLidarType();            //    switch (syslidartypestr)            //    {            //        case "LidarData_ZKGD"://中科光电激光雷达            //            return new LidarData_ZKGD();            //        case "LidarData_LD"://蓝盾激光雷达            //            return new LidarData_LD();            //        default:            //            return new LidarData_LD();            //    }         }        



原创粉丝点击