Spring.Net学习笔记二(自己用工厂的方式搭建一个IOC容器)
第一篇文章大致能跑起来一个基于Spring.Net程序,现在这篇主要的是介绍自己如何搭建一个IOC容器,以便更好的理解和掌握IOC。
第一步:用字典模拟IOC容器。
1 public class IOCFactory 2 { 3 private IDictionary<string, object> IocDict = new Dictionary<string, object>(); 4 public IOCFactory(string fileName) 5 { 6 XElement root = XElement.Load(fileName); 7 8 XNamespace space = "http://www.springframework.net"; 9 var objects = from obj in root.Elements(space + "object") select obj; 10 IocDict = objects.ToDictionary( 11 k => k.Attribute("name").Value, 12 v => 13 { 14 string typeName = v.Attribute("type").Value; 15 Type type = Type.GetType(typeName); 16 return Activator.CreateInstance(type); 17 } 18 ); 19 } 20 /// <summary> 21 /// 获取对象 22 /// </summary> 23 /// <param name="id"></param> 24 /// <returns></returns> 25 public object GetObject(string name) 26 { 27 object result = null; 28 if (IocDict.ContainsKey(name)) 29 { 30 result = IocDict[name]; 31 } 32 return result; 33 } 34 }
第二步:调用代码
1 static void Main(string[] args) 2 { 3 var path = @"E:\code\IOCDemo\MovieApp\Objects.xml"; 4 IOCFactory factory = new IOCFactory(path); 5 IPersonDao dao = (IPersonDao)factory.GetObject("PersonDao"); 6 if (dao != null) 7 { 8 dao.Save(); 9 Console.WriteLine("我是IoC方法"); 10 Console.ReadKey(); 11 } 12 Console.ReadLine(); 13 }
第三步:配置文件
1 <objects xmlns="http://www.springframework.net"> 2 <!--这里放容器里面的所有节点--> 3 <description>An example that demonstrates simple IoC features.</description> 4 <!--name 必须要唯一的,type=类的全名称,所在的程序集--> 5 <object name="PersonDao" type="Dao.PersonDao1,Dao"> 6 </object> 7 </objects> 8
运行结果:
在这次测试中,无意中遇到Linq TO XML的时候root.Elements("object")返回值为null,后面才知道是因为命名空间的缘故,接受的参数是XName,XName与String存在隐式转换,但是带命令空间的XML,必须要带命名空间,不然无法得到想要的值,通过反编译工具,public static XName operator +(XNamespace ns, string localName); 只要把XNamespace加上本地名称(string),就是一个XName了,故直接连接即可。