Spring.Net 技术简介 IOC and DI

 

一 简单介绍

    
      IOC 控制转移,就是将创建放到容器里,从而达到接耦合的目的,DI是 在容器创建对象的时候,DI读取配置文件,然后给对象赋默认值,两者一般结合使用,实现注入。
     Spring.Net的功能:自动装配、属性和构造器参数依赖注入、依赖检查、生命周期接口等等,使用起来感觉更多的是配置,非常关键的就是App.Config配置文件
     技术使用的场景:在需要进行模块之间解耦操作的时候可以用到,一般的解耦操作用的都是面向接口编程,从而达到模块之间的解耦,解耦的意思就是:即使下一级模块修改后,依赖它的上一级模块也不需要改变,这就是解耦了。通常的做法,其中一种做法是,先抽象下一级模块的接口,在下一级模块和上一级模块之间创建一个工厂模块,上一级使用下一级抽象出的接口进行编程,实例使用工厂模块进行实例。工厂模块实例的方法有很多,简单的是直接实例,高级的是通过反射进行实例。具体可以在工厂模式中了解,之后也会针对几种设计模式写博文,紧急需要的可以给我留言,可以将我的个人总结发给你先。
     从上面的介绍,这个方法其实挺麻烦的,而使用spring.net则相对简单很多,简单配置就可以达到效果。
     本文只是入门,更深入的学习请通过API文档进行详细学习。
     关于Spring.Net的缺点也是不得不提到的,Spring.Net本质毕竟还是反射,性能方面会有些损失,不适合对性能要求高的大访问量的互联网项目,不过在企业级应用中,OA系统,HR系统,都是完全没有问题的,以及访问量中等的,起码几千人在线访问,也不是有很大问题,具体使用,需要斟酌。
 

二 创建对象,以及设置属性

     下载好Spring.Net,新建项目
     一般在目录下 \Spring.NET-2.0.0-M1\Spring.NET\bin\net\4.0\release,下面是一堆得dll,下面就可以可是新建项目测试了
     新建一个控制台
    主要使用 Common.Logging.dll 日志,Spring.Core.dll 核心库
     
创建好了项目,然后我们就要开始了
     先修改App.config
   
  1. <? xml version =" 1.0 " encoding =" utf-8 " ?>
  2. < configuration>
  3. < configSections>
  4. < sectionGroup name = "spring " >
  5. <!-- 这下面有context和object在下面都有对象的标签 -->
  6. < section name = "context " type = "Spring.Context.Support.ContextHandler, Spring.Core " />
  7. < section name = "objects " type = "Spring.Context.Support.DefaultSectionHandler, Spring.Core " />
  8. </ sectionGroup >
  9. </ configSections>
  10.  
  11. < spring>
  12. <!-- Spring.Net对象容器的配置 -->
  13. < context >
  14. <!-- 容器的所有的对象在哪里,这里用uri说明地址 -->
  15. < resource uri = "config://spring/objects " />
  16. <!-- 可以使用外部xml文件 -->
  17.  
  18. </ context >
  19.  
  20. <!-- objects:配置的容器里面的对象 -->
  21. < objects xmlns = "http://www.springframework.net " >
  22. < description >An example that demonstrates simple IoC features. </ description>
  23. <!-- name最好用类名,type第一个是类的全程加上程序集,后面一个是程序集名称 -->
  24. < object name = "UserInfoDal " type = "SpringNetDemo.UserInfoDal, SpringNetDemo " >
  25. <!-- 在这里是设置对象的属性,将Name的值设置成ctt -->
  26. < property name = "Name " value = "ctt " />
  27. </ object >
  28. </ objects >
  29.  
  30. </ spring>
  31.  
  32. </ configuration>
 这里注意:配置放在<startup>标签后面会报错 “Spring.Context.Support.ContextRegistry”的类型初始值设定项引发异常,放在<startup>标签前面就可以了。
 
  1. public class UserInfoDal : IUserInfoDal
  2. {
  3. public string Name { get; set; }
  4.  
  5. public void Show()
  6. {
  7. Console .WriteLine("zjh and "+Name );
  8. }
  9. }
Program里面
  1. class Program
  2. {
  3. static void Main(string [] args)
  4. {
  5. //IApplicationContext是Spring里面的一个超类,主要操作类
  6. IApplicationContext ctx = ContextRegistry .GetContext();
  7. //GetObject从配置文件中读取信息后,反射产生相应的对象,用as强转成对象的接口
  8. IUserInfoDal userInfoDal = ctx.GetObject("UserInfoDal" ) as IUserInfoDal;
  9. //轻松加愉快,就这样出来了
  10. userInfoDal.Show();
  11. Console .ReadKey();
  12. }
  13. }
结果  zjh  and  ctt
 

三 创建复杂属性的设置

     创建一个服务测试类
  1. public class UserInfoService
  2. {
  3. public IUserInfoDal UserInfoDal { get ; set; }
  4.  
  5. public void Show()
  6. {
  7. UserInfoDal.Show();
  8. Console .WriteLine("it is service" );
  9. }
  10. }
 
     配置文件配置
 
  1. <? xml version =" 1.0 " encoding =" utf-8 " ?>
  2. < configuration>
  3. < configSections>
  4. < sectionGroup name = "spring " >
  5. <!-- 这下面有context和object在下面都有对象的标签 -->
  6. < section name = "context " type = "Spring.Context.Support.ContextHandler, Spring.Core " />
  7. < section name = "objects " type = "Spring.Context.Support.DefaultSectionHandler, Spring.Core " />
  8. </ sectionGroup >
  9. </ configSections>
  10.  
  11. < spring>
  12. <!-- Spring.Net对象容器的配置 -->
  13. < context >
  14. <!-- 容器的所有的对象在哪里,这里用uri说明 -->
  15. < resource uri = "config://spring/objects " />
  16. <!-- 可以使用外部xml文件 -->
  17.  
  18. </ context >
  19.  
  20. <!-- objects:配置的容器里面的对象 -->
  21. < objects xmlns = "http://www.springframework.net " >
  22. < description >An example that demonstrates simple IoC features. </ description>
  23. <!-- name最好用类名,type第一个是类的全程加上程序集,后面一个是程序集名称 -->
  24. < object name = "UserInfoDal " type = "SprintNetDemo.UserInfoDal, SprintNetDemo " >
  25. <!-- 在这里是设置对象的属性,将Name的值设置成ctt -->
  26. < property name = "Name " value = "ctt " />
  27. </ object >
  28. <!-- 在这里配置UserInfoService对象 -->
  29. < object name = "UserInfoService " type = "SprintNetDemo.UserInfoService, SprintNetDemo " >
  30. <!-- 在这里配置UserInfoService对象的UserInfoDal属性,执行上面产生的对象 -->
  31. < property name = "UserInfoDal " ref = "UserInfoDal " />
  32. </ object >
  33. </ objects >
  34.  
  35. </ spring>
  36.  
  37. </ configuration>
 
program代码
 
  1. static void Main( string[] args)
  2. {
  3. //IApplicationContext是Spring里面的一个超类,主要操作类
  4. IApplicationContext ctx = ContextRegistry .GetContext();
  5. //创建出对象,主要在配置文件中对UserInfoService的UserInfoDal属性进行复制
  6. UserInfoService userInfoService = ctx.GetObject( "UserInfoService" ) as UserInfoService;
  7. userInfoService.Show();
  8. Console.ReadKey();
  9. }
 
结果
zjh  and  ctt
it is service
 

四 总结

 
     本文主要,简单地讲解了一些Spring.Net的例子,我这次也是项目中用到了,将自己的一些使用心得写出来,虽然例子比较简单,但是还是可以看出Spring.Net的强大之处,当然这里介绍的只是冰山一角。
     Spring.Net的中文文档,2007就没有再更新过了,如果大家想进一步学习,推荐阅读英文文档,当然英文不太好,阅读java的spring一样样的,嘿嘿,java有中文文档哟。
  如果有错误,欢迎指出来,谢谢。
 
 
 
 
 
 
 
 
 
 
 

IOC and DI的更多相关文章

  1. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  2. 初识Spring框架实现IOC和DI(依赖注入)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...

  3. 对IOC和DI以及AOP的理解

    为了理解Spring的IoC与DI从网上查了很多资料,作为初学者,下面的描述应该是最详细,最易理解的方式了. 首先想说说IoC(Inversion of Control,控制倒转).这是spring的 ...

  4. Spring4学习笔记1-HelloWorld与IOC和DI概述

    1.安装环境 1.1安装eclipse,jdk 1.1安装Spring tool suite(非必要项) 2.spring HelloWorld 2.1 需要的jar包(spring官网下载:http ...

  5. IoC和DI的理解

    1 概述 当我们想闭上眼睛想如何让我们的软件更加可用可维护时,我们总能想到一个词:松耦合.在这篇文章中,主要讲述了模块间存在的依赖关系,但这种依赖关系违背了依赖倒置原则.在这之后,我们将讨论一种解除软 ...

  6. Spring控制反转与依赖注入(IOC、DI)

    IOC: 反转控制   Inverse Of Control DI:依赖注入 Dependency Injection 目的:完成程序的解耦合 解释:在应用系统的开发过程中,有spring负责对象的创 ...

  7. [原创]java WEB学习笔记97:Spring学习---Spring 中的 Bean 配置:IOC 和 DI

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. 对依赖倒置原则(DIP)及Ioc、DI、Ioc容器的一些理解

    1.概述 所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体.简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模 ...

  9. 深入理解DIP、IoC、DI以及IoC容器(转)

    深入理解DIP.IoC.DI以及IoC容器 摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.D ...

  10. 【转】深入理解DIP、IoC、DI以及IoC容器

    原文链接:http://www.cnblogs.com/liuhaorain/p/3747470.html 前言 对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有 ...

随机推荐

  1. Android物业动画研究(Property Animation)彻底解决具体解释

     前p=1959">Android物业动画研究(Property Animation)全然解析具体解释上已经基本展示了属性动画的核心使用方法: ObjectAnimator实现动画 ...

  2. UML之轻松入门(2)-掌握Junit,让我们的开发更高效

         使用UML不仅能够形象化的表达我们的程序思想,并且能够帮助我们提高程序的质量.一个杂乱无章的程序让维护者望而生畏,其成本也可想而知.在面向程序设计(OOD)中有5条原则是帮助我们设计一个高效 ...

  3. UVA 10139 Factovisors(数论)

    Factovisors The factorial function, n! is defined thus for n a non-negative integer: 0! = 1 n! = n * ...

  4. Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录

    1.首先在mysql创建一个存用户的表格 create table test_user ( user_id bigint(20) unsigned not null auto_increment co ...

  5. jquery.validate 验证(支持前台js验证通过,然后ajax后台数据校验)二

      jquery.validate  为啥 源码 里面 规定 dataType: "json" 呢 因为 他配套的 是  messages  下面 的 remote  属性 验证失 ...

  6. 关于android中sqllite对时间的操作

    sql 中有时间的类型,date,time,datetime,方便关于记录的维护,下面一个demo演示怎么在每条记录中默认增加时间 源码下载地址 http://www.codes51.com/code ...

  7. SALT 加密

    大家都知道,MD5加密是不可逆.但事实上,我们通常值的MD5算法.黑客的眼下破解率相对较高.也有非常多站点上干脆就提供批量解密MD5的服务,当然是收费的.http://www.xmd5.org.这里提 ...

  8. Android NDK进入发展

    使用互联网有很多javah命令生成一个头文件来完成JNI写,但事实上ADT集成NDK后.点点鼠标就可以了,网上的介绍是非常小懒的方法,在这里,我们主要谈论的懒惰JNI发展. 为ADT组态NDK.请个人 ...

  9. C# 编译器选项 /platform(指定输出平台)32位程序运行到x64平台的问题

    如果说你编译的exe运行时报错: “尝试读取或写入受保护的内存.这通常指示其他内存已损坏” 这很有可能是你是以非托管的方式错误地引用了64位的API中去. 为什么会这样? 那你就要考虑VS的编译器选项 ...

  10. Gimp教程:制作彩色的网站横幅

    效果图: Step1.新建900x200的透明图层 Step2.点选画笔工具,在左下方的设置界面进行如下: 设置画笔,动态,颜色,勾选应用抖动,然后试着在图层上画一画,调节一下画笔大小,相信你能作出如 ...