IOC解耦

1.先定义一个数据接口和两个数据实现类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IDAL
{
   public interface IStudent
    {
       //读
       string Reading();

       //写
       string Writing();

    }
}

  

using IDAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MSDAL
{
    public class Student : IStudent
    {

        public string Reading()
        {
            return "Reading , this is MSDAL";
        }

        public string Writing()
        {
            return "Writing , this is MSDAL";
        }
    }
}

  

using IDAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MySqlDAL
{
    public class Student : IStudent
    {
        public string Reading()
        {
            return "Reading , this is MySqlDAL";
        }

        public string Writing()
        {
            return "Writing , this is MySqlDAL";
        }
    }
}

  

2.实现客户端调用---直接调用

class Program
    {
        static void Main(string[] args)
        {
            //1.紧耦合 要切换数据库改动很多
             MSDAL.Student studentMS = new MSDAL.Student();
             Console.WriteLine("1" + studentMS.Writing() + studentMS.Reading());
             //MySqlDAL.Student studentMySql = new MySqlDAL.Student();
             //Console.Write(studentMySql.Writing() + studentMySql.Reading());
     }  
    }

  

3.实现客户端调用---接口编程 依赖抽象

class Program
    {
        static void Main(string[] args)
        {
          //2.接口编程 依赖抽象    要切换数据库改动较多
             IStudent student = new MSDAL.Student();//Student类对象还是出现在前台, 紧耦合
            // IStudent student = new MySqlDAL.Student();
             Console.WriteLine("2" + student.Writing() + student.Reading());
        }
    }

  

4.实现客户端调用---反射解耦

class Program
    {
        static void Main(string[] args)
        {
             //3.反射解耦            
            string assemblyName = "MSDAL";//程序集名称
            string className = assemblyName + ".Student";//类的全名称
            //IOC(控制反转):对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它
            IStudent studentReflection = (IStudent)Assembly.Load(assemblyName).CreateInstance(className);
            Console.WriteLine("3" + studentReflection.Writing() + studentReflection.Reading());   
      }
    }

5.实现客户端调用---反射+配置文件

class Program
    {
        static void Main(string[] args)
        {

            //4.反射+配置文件
            string assemblyNameConfiguration = ConfigurationManager.AppSettings["DAL"]; //程序集名称 可在配置文件中灵活切换数据层
            string classNameConfiguration = assemblyNameConfiguration + ".Student";//类的全名称

            //IOC(控制反转):对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它
            IStudent studentConfiguration = (IStudent)Assembly.Load(assemblyNameConfiguration).CreateInstance(classNameConfiguration);
            Console.WriteLine("4" + studentConfiguration.Writing() + studentConfiguration.Reading());
            }
    }

6.实现客户端调用---Spring.Net创建对象解耦

需要添加Spring.Core.dll程序集引用

class Program
    {
        static void Main(string[] args)
        {
         //5.Spring.Net创建对象
            IApplicationContext SpringContext = Spring.Context.Support.ContextRegistry.GetContext();//spring容器
            IStudent studentSpring = (IStudent)SpringContext.GetObject("DAL");//创建实例对象
            Console.WriteLine("5" + studentConfiguration.Writing() + studentConfiguration.Reading());
        }
    }

 配置文件  

<?xml version="1.0"?>
<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="~/Objects.xml"/>-->
      <resource uri="config://spring/objects"/>
    </context>    
    <objects>    
      <object id="DAL" type="MSDAL.Student,MSDAL"></object>
    </objects>
  
  </spring>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>

7.实现客户端调用---Unity 创建对象解耦

需要添加Microsoft.Practices.Unity.dll和Microsoft.Practices.Unity.Configuration.dll程序集引用

class Program
    {
        static void Main(string[] args)
        {
             //6.Unity 创建对象
            IUnityContainer mycontainer = new UnityContainer();//Unity容器
            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");//配置文件信息
            section.Configure(mycontainer);//将配置文件信息给Unity容器        
            IStudent studentUnity = mycontainer.Resolve<IStudent>();//创建实例对象
            Console.WriteLine("6" + studentUnity.Writing() + studentUnity.Reading());  
        }
    }

配置文件

<?xml version="1.0"?>
<configuration>
  <configSections>

    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
 </configSections>
<unity>
    <container>     
      <register type="IDAL.IStudent,IDAL" mapTo="MSDAL.Student,MSDAL">
        <lifetime type="singleton"/>
      </register>
    </container>
  </unity>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup>
</configuration>

源码:https://files.cnblogs.com/files/imhaiyang/IOC.rar

posted @ 2015-05-27 15:03  马羊  阅读(592)  评论(0)    收藏  举报