zoukankan      html  css  js  c++  java
  • 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-M1Spring.NETin et4.0 elease,下面是一堆得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有中文文档哟。
      如果有错误,欢迎指出来,谢谢。
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    jsp mysql 配置线程池
    服务端 模拟 检测 攻击。。乱写
    硕思闪客精灵 7.2 破解版
    unity UnityAwe 插件
    smartfoxserver 2x 解决 Math NAN
    unity 断点下载
    java 监听文件目录修改
    wind7 64 setup appjs
    sfs2x 修改jvm 内存
    unity ngui 解决图层问题
  • 原文地址:https://www.cnblogs.com/zhujinghui/p/3371083.html
Copyright © 2011-2022 走看看