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了,故直接连接即可。

posted @ 2015-08-05 13:57  王永华  阅读(436)  评论(0编辑  收藏  举报