您的位置:首页 > 编程语言 > Java开发

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

2017-05-13 23:25 736 查看
主流的依赖注入方案:微软企业库中的Unity、Spring.NET、StructureMap、Ninject、Castle Windsor等等。

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

实例:使用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节点

<?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.[b]EF_UserInfoDal, Spring.Net">[/b]
</object>
</spring>
</configuration>


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 配置文件中

<object name="UserInfoDal" type="Spring.Net.EF_UserInfoDal, Spring.Net">
将 EF_UserInfoDal 改为 ADO_NetUserInfoDal 则
输出:

    我是 AdoNet Dal

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


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: