zoukankan      html  css  js  c++  java
  • 反射 + 配置文件 实现IOC容器

    IOC实现:


    IOC容器我们只停留在知道上是不行的,我们要动手做印象对更深刻,那么我给大家看一个代码。看看代码中IOC容器的实现。


    代码实现:


    创建一个类库:


    解决方式的类库建立:




    创建一个实体类:User:


    <span style="font-size:18px;">using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Spring.Demo.Model
    {
        /// <summary>
        /// 用户类
        /// </summary>
        public class Users
        {
            /// <summary>
            /// 编号
            /// </summary>
            private int _oid;
            public int Oid
            {
                get { return _oid; }
                set { _oid = value; }
            }
    
            /// <summary>
            /// 姓名
            /// </summary>
            private string _name;
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
    
            /// <summary>
            /// 性别
            /// </summary>
            private string _sex;
            public string Sex
            {
                get { return _sex; }
                set { _sex = value; }
            }
    
            /// <summary>
            /// 年龄
            /// </summary>
            private int _age;
            public int Age
            {
                get { return _age; }
                set { _age = value; }
            }
        }
    }</span>

    创建IUsers的接口:


    <span style="font-size:18px;">using System;
    using System.Collections.Generic;
    using System.Text;
    namespace Spring.Demo.Service
    {
        public interface IUsers
        {
            /// <summary>
            /// 返回用户的具体信息的方法
            /// </summary>
            /// <returns></returns>
            string GetUserInfo();
        }
    }
    </span>

    创建一个实现IUsers接口的实现类:


    <span style="font-size:18px;">using System;
    using System.Collections.Generic;
    using System.Text;
    using Spring.Demo.Service;
    using Spring.Demo.Model;
    
    namespace Spring.Demo.Compontext
    {
        public class UsersCompontents : IUsers
        {
            public UsersCompontents()
            { }
    
            #region 获取用户信息
            public string GetUserInfo()
            {
                Users user = new Users();
                user.Oid = 1;
                user.Name = "Beniao";
                user.Sex = "Boy";
                user.Age = 25;
    
                return string.Format("编号:{0}--->姓名:{1}--->性别:{2}--->年龄:{3}",
                    user.Oid,
                    user.Name,
                    user.Sex,
                    user.Age);
            }
            #endregion
        }
    }</span>

    创建測试类:


    <span style="font-size:18px;">using ITOO.Library.Core.AOP;
    using Spring.Context;
    using Spring.Demo.Service;
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Text;
    
    namespace Sping.Demo.SimpleTest
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                IUsers studentChangeBll = SpringHelper.GetObject<IUsers>("Users");
    
                Console.WriteLine(studentChangeBll.GetUserInfo());
                Console.Read();
            }
        }
    }</span>

    在控制台程序中创建一个配置文件:


    <span style="font-size:18px;"><?xml version="1.0" encoding="utf-8" ?

    > <configuration> <configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> </configSections> <spring> <context> <resource uri="config://spring/objects"/> </context> <objects xmlns="http://www.springframework.net"> <!--这的配置依据实际的程序来的。UsersCompontents是程序集Spring.Demo.Compontext下的一个类--> <object name="Users" type="Spring.Demo.Compontext.UsersCompontents,Spring.Demo.Compontext" singleton="false" > </object> </objects> </spring> </configuration></span>


    执行后,发现SpringHelper却小引用。

    我们一般写代码中我们是这样写的:


    <span style="font-size:18px;">//从config文件中取得程序集信息
    IApplicationContext context = ConfigurationManager.GetSection("spring/context")
                                   as IApplicationContext;
    //调用方法
    //Users为config文件中的配置节
    //<object name="Users"       
    //        type="Spring.Demo.Compontext.UsersCompontents,Spring.Demo.Compontent">
    //</object>
    IUsers user = context.GetObject("Users") as IUsers;</span>

    这样我们就能够从配置文件里将对象取出来,可是我们都不想在代码中有多余的代码。不能每一次new对象的时候,我们都要写一遍这句话:IApplicationContext context = ConfigurationManager.GetSection("spring/context") as IApplicationContext;这样就添加了我们维护代码的成本,因此。我们将这句话封装起来,封装的代码是这种:


    创建一个类:SpringHelper:


    <span style="font-size:18px;">using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Spring.Context;
    using Spring.Context.Support;
    
    namespace ITOO.Library.Core.AOP
    {
        public class SpringHelper
        {
            /// <summary>
            /// Spring容器上下文
            /// </summary>
            private static IApplicationContext SpringContext
            {
                get
                {
                    return ContextRegistry.GetContext();
                }
            }
    
    
            /// <summary>
            /// 获取配置文件 配置的 对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="objName"></param>
            /// <returns></returns>
            public static T GetObject<T>(string objName) where T : class
            {
                return (T)SpringContext.GetObject(objName);
            }
        }
    }
    
    
    </span>

    以上的代码我们就能够将每次读取配置文件里的那句话去掉了,我们直接就能够写这样一句话就能够了:IUsers studentChangeBll = SpringHelper.GetObject<IUsers>("Users");


    这里体现了封装的重要性。先前我在做AOP的时候。我的师傅看到了类似这种代码的时候,他就跟我讨论过这个问题,我当时懵懵懂懂,没有进行下一步的行动,如今想想,问题出如今我根本没有动手去做,或者知识没有深入到那个层次,认识这个知识的方面没有那么深。

    全部问题,都要动手去做才行。


    总结:


    我们从上面的实践到分析之后,我们发现事实上我们看似是新的东西,事实上我们已经学习过了,就像IOC容器一样,我们学习过了反射和配置文件。我们发现事实上IOC容器不就是反射和配置文件来实现的吗,反射和配置文件是我们在大话设计模式中就已经学习到了的东西,这都不是新的东西。一个看似复杂的东西,都是有简单的东西来组装成的。我们知道这个。就不会对新的东西有畏惧感了。


  • 相关阅读:
    排列组合
    动态规划-上台阶
    砝码称重3
    砝码称重2
    砝码称重1
    砝码称重
    TestDirector其他
    TestDirector域或工程用户的管理
    TestDirector创建域或工程
    LoadRunner8 安装步骤
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7102513.html
Copyright © 2011-2022 走看看