走了一段也该停下来写点东西了,最近一段时间整理了一下之前写过的一些代码,和工具,整合在一个自己的框架dll中方便日后使用。同时也公开部分代码与大家一起分享。

        今天我们说说接口依赖注入,面向接口的编程其意义不用多说大多数人应该已经熟记再心,不过我还真遇到过在类名上加个I就说这个是接口的人,无语!接口,形象点就是u盘接口,你可以接入各个品牌型号,大小的u盘,然而要像u盘那样实现热插拔,就是我们今天的内容,依赖注入。从配置中指定实现接口的dll及实现类,如:

配置文件中,每个接口类对应一个接口实现类,我们在不从新编译的情况下,可以通过配置文件的修改,实现修改接口实现类的转换。

我们需要第一步,读取配置文件:

/// <summary>
        /// 获取接口注入节点
        /// </summary>
        public Dictionary<string, string> Interface
        {
            get
            {
                DataCache cache = new DataCache(string.Format("{0}_{1}", path, "interface"));
                Dictionary<string, string> res = cache.Get() as Dictionary<string, string>;
                if (res == null)
                {
                    res = Query(path, "interface");
                    cache.Set(res, 720);
                }
                return res;
            }
        }

 

像这些配置节点文件我一般是先读取到缓存中后使用

#region 获取xml键值集合
        /// <summary>
        /// 获取xml键值集合
        /// configuration-->config
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>        
        public static Dictionary<string, string> Query(string path, string elementsName)
        {
            var query = from q in XDocument.Load(path).Elements("configuration").Elements(elementsName).Elements("add")
                        select q;
            return query.ToDictionary(q => q.Attribute("key").Value, v => v.Attribute("value").Value);
        }
        #endregion

 

第二步,动态实现,说到动态实现,我们就离不开一个概念,反射,接口的反射c#给我们提供的完整的解决方案。

绝对路径反射

 

objType =Assembly.LoadFile(assemblyPath).CreateInstance(classNamespace,true);

相对路径反射:

 

 

objType =Assembly.Load(assemblyPath).CreateInstance(classNamespace,true);

获取反射对象:

 

/// <summary>
        /// 获取反射接口对象
        /// </summary>
        /// <param name="className">类名</param>
        /// <returns></returns>
        public static T GetObject(string className)
        {
            string ClassNamespace = AssemblyName + "." + className;
            object objType = CreateObject(AssemblyPath, ClassNamespace);
            return (T)objType;
        }

 

从配置文件中读取接口实现类进行反射

 

/// <summary>
        /// 获取反射接口对象(依赖注入)
        /// </summary>
        /// <returns></returns>
        public static T GetObject()
        {
            return GetObject(Config.Interface[typeof(T).Name]);
        }

 

到此,我们就可以在业务层进行轻松调用:

 

 

ICity city =DataAccess<ICity>.GetObject();

请看demo
interfaceDemo.rar

 

转载请注明出处:http://qinnailin.cn/article/64