zoukankan      html  css  js  c++  java
  • spring.net中的IOC和DI-初使用

     前面准备:下载spring.net并解压

    下载地址:spring.net下载地址

    Ioc:控制反转         DI:依赖注入

    一、IOC(控制反转)

    1.新建一个控制台程序springTest,引用dll。

       Spring.NET > bin > net > 4.0 > release下找到 Comon.Logging.dll和Spring.Core.dll这两个dll复制到项目中添加引用

    2.添加一个接口

    interface Person
        {
          void Show();
        }

    3.添加两个类实现接口

    public class zhangsan:Person 
        {
            public void Show()
            {
                Console.WriteLine("Hello World 张三");
            }
        }
    public class LiSi:Person
        {
            public void Show()
            {
                Console.WriteLine("Hello World 李四");
            }
        }

    4.修改配置文件app.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <!-- 这个节点要紧靠在configuration下面-->
      <configSections>
        <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">
          <description>An  example that demonstrates simple IoC features.</description>
         <!-- 容器-->
          <!-- name要唯一,type="类的全名称,所在程序集"-->
          <object name="zhangsan" type="springTest.zhangsan,springTest"></object>
          <object name="lisi" type="springTest.lisi,springTest"></object>
        </objects>
      </spring>
    </configuration>

    主要是 <configSections> 和<spring>两个节点里面的内容,<configSections>的内容是固定的,要修改的是<spring>下的内容

     5.开始写主函数

     class Program
        {
            static void Main(string[] args)
            {
                //普通创建Iperson方式控制权没有反转,要new出来,偶合性高
                //IPerson person = new zhangsan();
    
                //创建实例的方式转为容器帮我们创建
                //创建容器上下文
                IApplicationContext ctx = ContextRegistry.GetContext();
                IPerson person = ctx.GetObject("zhangsan") as IPerson;
                person.Show();
                Console.ReadKey();
            }
        }

    结果:

      这就实现了Spring.Net中的Ioc操作

    6.把容器单独写到一个xml文件

    因为每个需要用到控制反转的类都要配置到配置文件中,如果非常多类,那配置文件就很难看了。所以最好把配置放到一个单独的xml文件中

    6.1 添加一个xml文件这里命名为:person.xml放到一个lib文件夹里

    6.2 把app.config配置文件中的 objects节点复制到person.xml文件中,然后把app.config配置文件中objects里面的节点都删除,注意objects节点保留

    <?xml version="1.0" encoding="utf-8" ?>
    <objects xmlns="http://www.springframework.net">
      <description>An  example that demonstrates simple IoC features.</description>
      <!-- 容器-->
      <!-- name要唯一,type="类的全名称,所在程序集"-->
      <object name="zhangsan" type="springTest.zhangsan,springTest"></object>
      <object name="lisi" type="springTest.lisi,springTest"></object>
    </objects>

    6.3在app.config中节点<spring>中加入person.xml文件的关联<resource uri="file://person.xml"/>

    <!-- spring.Net节点配置-->
      <spring>
        <context>
          <!-- 容器配置-->
          <resource uri="file://person.xml"/>
          <resource uri="config://spring/objects"/>
        </context>
        <objects xmlns="http://www.springframework.net">
        </objects >
      </spring>

    6.4 因为控制台程序默认的根路径为bin下的debug文件夹,所以要把person.xml生成时复制到debug文件夹下

     在person.xml文件鼠标右键=>属性=>复制到输出目录=>始终复制

    配配置完成,再次运行,效果和原来的一样,以后容器的配置就可以在单独的xml文件里增加了。

    二、DI(依赖注入)

    1.修改zhangsan类,变成

     public class zhangsan:IPerson 
        {
           public string Name { get; set; }
            public void Show()
            {
                Console.WriteLine("Hello World "+Name);
            }
        }

    2.修改person.xml文件中的节点

    <object name="zhangsan" type="springTest.zhangsan,springTest">
        <property name="Name" value="张三"/>
      </object>

    3.运行结果和原来一样,属性的值也可以在文件中配置了:

    4.还有一种情况,添加一个类

    public  class PersonName
        {
           public string Name { get; set; }
        }

    5.修改zhangsan类

    public class zhangsan:IPerson 
        {
           PersonName pName = new PersonName();
            public void Show()
            {
                Console.WriteLine("Hello World "+pName.Name);
            }
        }

    6.这样就不能用上面那种属性注入方法了,这时要修改person.xml变成

    <object name="zhangsan" type="springTest.zhangsan,springTest">
        <property name="pName" ref="pname"/>
      </object>
      <object name="pname" type="springTest.PersonName,springTest">
        <property name="Name" value="张三"/>

     运行结果依然是和原来一样。

    这就是DI,属性注入。

  • 相关阅读:
    植物大战僵尸英文原版
    2020-5-13递归练习 六人参加竞赛
    2020-5-1递归练习
    java当脚本用。QQ表白轰炸机
    面向实战---VUE项目的文件加载顺序,或者加载流程,以及index.html,main.js,app.vue的区别
    CSS多个view随机分布,不重叠,如何实现呢?
    vite项目才踩坑日志1
    css属性之clip-path
    纯CSS3实现的阳光海鸥沙滩遮阳伞和比基尼美女风景动画效果源码
    TP5 中使用wherein 进行查询,太慢了,怎么优化?
  • 原文地址:https://www.cnblogs.com/wei325/p/5406283.html
Copyright © 2011-2022 走看看