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

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

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

 

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

如:

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

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

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

 

1、先创建一个控制台程序项目。

2、添加IUserInfoDal 接口。

namespace Spring.Net
{
    public interface IUserInfoDal
    {
        void Show();
    }
}

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

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");
        }     
    }

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

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



  
  
    
    
      

 

6、主函数,创建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 配置文件中

将 EF_UserInfoDal 改为 ADO_NetUserInfoDal 则
输出:
 
  
    我是 AdoNet Dal

类似于抽象工场(使用反射机制,在配置文件中配置)

你可能感兴趣的:(C#从入门到精通)