主流的依赖注入方案:微软企业库中的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节点

<?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>

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

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

C#设计模式之控制反转即依赖注入-Spring.NET的更多相关文章

  1. C#设计模式之控制反转即依赖注入-微软提供的Unity

    使用VS2015的Nuget管理器下载Unity. 程序员接口类: 1 namespace UnityDemo 2 { 3 public interface IProgrammer 4 { 5 voi ...

  2. [.net 面向对象程序设计深入](26)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](26)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  3. [.net 面向对象程序设计深入](31)实战设计模式——使用Ioc模式(控制反转或依赖注入)实现松散耦合设计(1)

    [.net 面向对象程序设计深入](31)实战设计模式——使用IoC模式(控制反转或依赖注入)实现松散耦合设计(1) 1,关于IOC模式 先看一些名词含义: IOC: Inversion of con ...

  4. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  5. 轻松了解Spring中的控制反转和依赖注入(二)

    紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...

  6. spring学习总结一----控制反转与依赖注入

    spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转 ...

  7. Java Web实现IOC控制反转之依赖注入

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...

  8. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

    .NET Core ASP.NET Core Basic 1-2 本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样 ...

  9. 【Spring Framework】Spring 入门教程(一)控制反转和依赖注入

    参考资料 Spring 教程 说在前面 什么样的架构,我们认为是一个优秀的架构? 判断准则:可维护性好,可扩展性好,性能. 什么叫可扩展性好? 答:在不断添加新的代码的同时,可以不修改原有代码,即符合 ...

随机推荐

  1. java中日期常用

    Java中日期的几种常见操作 —— 取值.转换.加减.比较 Java 的开发过程中免不了与 Date 类型纠缠,准备总结一下项目经常使用的日期相关操作,JDK 版本 1.7,如果能够帮助大家节约那么几 ...

  2. element自定义表单验证

    element-ui框架下修改密码弹窗进行表单验证. 除了基础校验,密码不为空,长度不小于6字符,需求中还需校验密码由数字和字母组合. 处理代码如下: <el-dialog :visible.s ...

  3. 【c++】【常用函数】

    分割字符串:https://www.cnblogs.com/zealousness/p/9971709.html 字符串比较:https://www.cnblogs.com/zealousness/p ...

  4. pandas_datareader.data 和 fix_yahoo_finance 获取金融数据

    参考:https://zhuanlan.zhihu.com/p/35360694 1.获取数据 #定义所需要的数据 gafataDict={"谷歌":"GOOG" ...

  5. ubuntu14下创建软件的快捷启动方式

    下载软件,使用softname/bin/softname.sh即可启动,但是很麻烦,每次都要打开terminal 为了方便,我们需要创建desktop文件指向这个启动软件的shell文件(以创建Pyc ...

  6. getApplicationContext()、Activity.this、 getBaseContext区别

    getApplicationContext()返回应用的上下文,生命周期是整个应用,应用退出它才被摧毁 Activity.this 返回当前activity的上下文,属于activity ,activ ...

  7. 010-Shell 输入/输出重定向

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令通常将其输出写入到标准输出,默 ...

  8. 单舵轮(叉车)AGV里程计数据解算

    单舵轮(叉车)AGV里程计数据解算 2016-07 单舵轮AGV,一般包含一个驱动轮和两个从动轮,驱动轮是同时具备行走和转向两个功能的舵轮,因此,单舵轮AGV的运动学自由度为2个.舵轮线速度V1,舵轮 ...

  9. 汇编的WEAK关键字

    一般来说,这个关键字使用在IMPORT和EXPORT这两个声明段. ////////////////////////////////////////////////////////////////// ...

  10. 转:js获取json中key所对应的value值

    <script type="text/javascript"> getJson('age'); function getJson(key){ var jsonObj={ ...