C#设计模式之控制反转即依赖注入-Spring.NET

 

主流的依赖注入方案:微软企业库中的Unity、Spring.NET、StructureMap、Ninject、Castle Windsor等等。spring

本章用简单的案例讲解 Spring.NET IOC-控制反转即依赖注入:app

 

实例:使用Spring.NET IOC方式,解决复杂的数据访问,函数

如:spa

用户A须要使用ADO.NET实现数据访问层代码;.net

用户B须要使用EF实现数据访问层代码;code

遇到此种状况,若是不借助控制反转,使用普通的方式解决的话,则每一个用户都须要修改后台代码(违反了OOP中的开闭原则),才能实现不一样用户调用不一样数据访问层的问题cdn

 

一、先建立一个控制台程序项目。xml

二、添加IUserInfoDal 接口。对象

复制代码
namespace Spring.Net
{
    public interface IUserInfoDal
    {
        void Show();
    }
}
复制代码

三、添加Ado_NetUserInfoDal类和EFUserInfoDal类,继承IUserInfoDal接口。blog

ADO_NetUserInfoDal.cs
复制代码
public class ADO_NetUserInfoDal:IUserInfoDal
    {
        public void Show()
        {
            Console.WriteLine("我是 AdoNet Dal" );
        }
    }
复制代码

EF_UserInfoDal.cs

复制代码
public class EF_UserInfoDal: IUserInfoDal
    {
        public void Show()
        {
            Console.WriteLine("我是EF Dal");
        }     
    }
复制代码

四、引用Spring.Net程序集 Spring.Core.dll 和 Common.Logging.dll

五、添加Spring.Net配置节点,配置object节点

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!--必定要在紧跟着configuration下面添加-->
  <configSections>
    <!--跟下面Spring.Net节点配置是一一对应关系-->
    <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>
  
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

  <!--Spring.Net节点配置-->
  <spring>
    <context>
      <!--容器配置-->
      <resource uri="config://spring/objects"/>
    </context>
    <objects xmlns="http://www.springframework.net">
      <!--name 必需要惟一的,type=类的全名称,所在的程序集-->
     <object name="UserInfoDal" type="Spring.Net.EF_UserInfoDal, Spring.Net">
      </object>      
  </spring>
</configuration>
复制代码

六、主函数,建立spring容器上下文

复制代码
namespace Spring.Net
{
    class Program
    {
        static void Main(string[] args)
        {
            //控制权没有反转
            //IUserInfoDal infoDal = new EFUserInfoDal();
         //IUserInfoDal infoDal = new ADO_NetUserInfoDal();

//Spring.Net 建立实例的方式转为容器帮咱们建立
       //建立spring容器上下文 
       IApplicationContext ctx = ContextRegistry.GetContext();
      //经过容器建立对象
      IUserInfoDal efDal = ctx.GetObject("UserInfoDal") as IUserInfoDal;

      efDal.Show();
      Console.ReadKey();
     }
    }
   }

输出:
    我是EF Dal

注:
若是在app.config 配置文件中
<object name="UserInfoDal" type="Spring.Net.EF_UserInfoDal, Spring.Net">
将 EF_UserInfoDal 改成 ADO_NetUserInfoDal 则
输出:
    我是 AdoNet Dal相似于抽象工场(使用反射机制,在配置文件中配置)
相关文章
相关标签/搜索