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
   
  <? xml version =" 1.0 " encoding =" utf-8 " ?>
< configuration>
  < configSections>
    < sectionGroup name = "spring " >
      <!-- 这下面有context和object在下面都有对象的标签 -->
      < section name = "context " type = "Spring.Context.Support.ContextHandler, Spring.Core " />
      < section name = "objects " type = "Spring.Context.Support.DefaultSectionHandler, Spring.Core " />
    </ sectionGroup >
  </ configSections>
 
  < spring>
    <!-- Spring.Net对象容器的配置 -->
    < context >
      <!-- 容器的全部的对象在哪里,这里用uri说明地址 -->
      < resource uri = "config://spring/objects " />
      <!-- 可使用外部xml文件 -->
 
    </ context >
 
    <!-- objects:配置的容器里面的对象 -->
    < objects xmlns = "http://www.springframework.net " >
      < description >An  example that demonstrates simple IoC features. </ description>
      <!-- name最好用类名,type第一个是类的全称加上程序集,后面一个是项目名称 -->
      < object name = "UserInfoDal " type = "SpringNetDemo.UserInfoDal, SpringNetDemo " >
        <!-- 在这里是设置对象的属性,将Name的值设置成ctt -->
        < property name = "Name " value = "ctt " />
      </ object >
    </ objects >
 
  </ spring>
 
</ configuration>

 

 这里注意:配置放在<startup>标签后面会报错 “Spring.Context.Support.ContextRegistry”的类型初始值设定项引起异常,放在<startup>标签前面就能够了。
 
     public class UserInfoDal : IUserInfoDal
    {
        public string Name { get; set; }
 
        public void Show()
        {
            Console .WriteLine("zjh  and  "+Name );
        }
    }

 

Program里面
class Program
{
    static void Main(string [] args)
    {
        //IApplicationContext是Spring里面的一个超类,主要操做类
        IApplicationContext ctx = ContextRegistry .GetContext();
        //GetObject从配置文件中读取信息后,反射产生相应的对象,用as强转成对象的接口
        IUserInfoDal userInfoDal = ctx.GetObject("UserInfoDal" ) as IUserInfoDal;
        //轻松加愉快,就这样出来了
       userInfoDal.Show(); 
     Console .ReadKey();
    }
}

 

结果  zjh  and  ctt
 

三 建立复杂属性的设置

      建立一个服务测试类
public class UserInfoService
{
    public IUserInfoDal UserInfoDal { get ; set; }
 
    public void Show()
    {
        UserInfoDal.Show();
        Console .WriteLine("it is service" );
    }
}

 

 
     配置文件配置
 
<? xml version =" 1.0 " encoding =" utf-8 " ?>
< configuration>
  < configSections>
    < sectionGroup name = "spring " >
      <!-- 这下面有context和object在下面都有对象的标签 -->
      < section name = "context " type = "Spring.Context.Support.ContextHandler, Spring.Core " />
      < section name = "objects " type = "Spring.Context.Support.DefaultSectionHandler, Spring.Core " />
    </ sectionGroup >
  </ configSections>
 
  < spring>
    <!-- Spring.Net对象容器的配置 -->
    < context >
      <!-- 容器的全部的对象在哪里,这里用uri说明 -->
      < resource uri = "config://spring/objects " />
      <!-- 可使用外部xml文件 -->
 
    </ context >
 
    <!-- objects:配置的容器里面的对象 -->
    < objects xmlns = "http://www.springframework.net " >
      < description >An  example that demonstrates simple IoC features. </ description>
      <!-- name最好用类名,type第一个是类的全称加上程序集,后面一个是项目名称 -->
      < object name = "UserInfoDal " type = "SprintNetDemo.UserInfoDal, SprintNetDemo " >
        <!-- 在这里是设置对象的属性,将Name的值设置成ctt -->
        < property name = "Name " value = "ctt " />
      </ object >
      <!-- 在这里配置UserInfoService对象 -->
      < object name = "UserInfoService " type = "SprintNetDemo.UserInfoService, SprintNetDemo " >
        <!-- 在这里配置UserInfoService对象的UserInfoDal属性,执行上面产生的对象 -->
        < property name = "UserInfoDal " ref = "UserInfoDal " />
      </ object >
    </ objects >
 
  </ spring>
 
</ configuration>

 

 
program代码
 
static void Main( string[] args)
{
    //IApplicationContext是Spring里面的一个超类,主要操做类
    IApplicationContext ctx = ContextRegistry .GetContext();
    //建立出对象,主要在配置文件中对UserInfoService的UserInfoDal属性进行复制
    UserInfoService userInfoService = ctx.GetObject( "UserInfoService" ) as UserInfoService;
    userInfoService.Show();
    Console.ReadKey();
}

 

 
结果
zjh  and  ctt
it is service
 

四 总结

 
     本文主要,简单地讲解了一些Spring.Net的例子,我此次也是项目中用到了,将本身的一些使用心得写出来,虽然例子比较简单,可是仍是能够看出Spring.Net的强大之处,固然这里介绍的只是冰山一角。
     Spring.Net的中文文档,2007就没有再更新过了,若是你们想进一步学习,推荐阅读英文文档,固然英文不太好,阅读java的spring同样样的,嘿嘿,java有中文文档哟。
  若是有错误,欢迎指出来,谢谢。
相关文章
相关标签/搜索