走了一段也该停下来写点东西了,最近一段时间整理了一下之前写过的一些代码,和工具,整合在一个自己的框架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
浙公网安备 33010602011771号