实现一个简单的IOC框架

最近在spring.net框架,首篇学习了IOC/DI。通过简单的学习,我们是从配置xml文件中,添加<object>节点,然后创建容器,再创建容器对象。所以,实现一个ioc,一。需要读取配置文件xml中的节点对象 二。通过反射,将ioc对象,保存到一个字典中。

IOC/DI:反转了以往web程序创建所需对象及对象依赖,而是通过容器对象创建对象,并查找或创建容器对象所需依赖,并注入对象中。让容器控制了外部资源的获取。

<?xml version="1.0" encoding="utf-8" ?>
<objects>
    <object name="myIoc" type="SimpleIOC.model.Customer,SimpleIOC"></object>
</objects>

一。创建XML工厂类,加载xml文件,读取文件。并反射,维护容器对象到字典表中。

 public class MyXmlFactory
    {
        //声明字典对象保存IOC容器对象
        private Dictionary<string, object> xmlObject = new Dictionary<string, object>();

        public MyXmlFactory(string fileName) 
        {
            //创建ioc容器
            InstanceObject(fileName);
        }

        public void InstanceObject(string fileName) 
        {
            XElement rootXml = XElement.Load(fileName);//从xml文件中加载xml元素
            //使用linq to xml 获取xml文件中的配置对象
            var objects = from obj in rootXml.Elements("object") select obj;
            xmlObject = objects.ToDictionary(k => k.Attribute("name").Value, v => {
                string typeName = v.Attribute("type").Value;
                Type type = Type.GetType(typeName);//通过反射获取指定类型名称名称
                return Activator.CreateInstance(type);//通过类型名称,创建容器对象
            });
        }
        /// <summary>
        /// 通过key值,从容器对象字典中获取对象
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public object GetObject(string id) 
        {
            object result = null;
            xmlObject.TryGetValue(id, out result);
            return result;
        }
    }

二。调用xml工厂,获取容器创建对象

1 public static void Main(string[] args)
2         {
3             MyXmlFactory factory = new MyXmlFactory(@"F:\StudyCode\SpringIOC\手搭IOC框架\SimpleIOC\XML\ioc.xml");
4             //Customer customer = (Customer)factory.GetObject("myIoc");
5             Console.WriteLine(factory.GetObject("myIoc").ToString());
6             Console.ReadKey();
7         }

 

posted @ 2020-07-30 23:21  一生安然  阅读(335)  评论(0编辑  收藏  举报