Spring.Net学习笔记五(依赖注入)

谈到高级语言编程,我们就会联想到设计模式;谈到设计模式,我们就会说道怎么样解耦合。而Spring.NET的IoC容器其中的一种用途就是解耦合,其最经典的应用就是:依赖注入(Dependeny Injection)简称DI,目前DI是最优秀的解耦方式之一。下面我就来谈谈依赖注入的应用场景。

  我模拟了三种不同的场景,可以一起学习使用依赖注入的重要性。

下面是应用场景的条件:人类使用工具劳动。

    

     /**//// <summary>
    /// 抽象人类
    /// </summary>
    public abstract class Person
    {
        /**//// <summary>
        /// 使用工具劳动
        /// </summary>
        public abstract void Work();
    }
    public interface ITool
    {
        /**//// <summary>
        /// 使用工具
        /// </summary>
        void UseTool();
    }

      场景一,原始社会:原始人使用长矛打猎

    public class Spear : ITool
    {
        public void UseTool()
        {
            Console.WriteLine("使用长矛");
        }
    }

  PrimitivePerson

    public class PrimitivePerson : Person
    {
        /**//// <summary>
        /// 原始社会使用长矛打猎
        /// </summary>
        public override void Work()
        {
            //知道打猎使用的是长矛,并且制造长矛
            ITool tool = new Spear();
            tool.UseTool();
            Console.WriteLine("使用长矛打猎");
        }
    }

    

  从上面代码我们不难看出,虽然使用的经典的里氏替换原则,但PrimitivePerson类于Spear类存在着耦合。

  场景二,经济社会:使用工具耕作

    public class Hoe : ITool
    {
        public void UseTool()
        {
            Console.WriteLine("使用锄头");
        }
    }

     ToolFactory

    public static class ToolFactory
    {
        /**//// <summary>
        /// 工厂制造工具
        /// </summary>
        /// <returns></returns>
        public static ITool CreateTool()
        {
            return new Hoe();  // 制造锄头
        }
    }

  EconomyPerson

    public class EconomyPerson : Person
    {
        /**//// <summary>
        /// 经济社会使用锄头耕作
        /// </summary>
        public override void Work()
        {
            //不用知道什么工具,只需知道工厂能买到工具,而不自己制造工具,但仅由工厂制造锄头
            ITool tool = ToolFactory.CreateTool();
            tool.UseTool();
            Console.WriteLine("经济社会使用工具耕作");
        }
    }

    

  从上面代码我可以看出:运用的经典的工厂模式, EconomyPerson仅仅对工厂耦合,并不关心工厂是怎样制造工具。

 1 namespace Dao.IOC
 2 {
 3     public abstract class Person
 4     {
 5         /// <summary>
 6         /// 使用工具劳动
 7         /// </summary>
 8         public abstract void Work();
 9     }
10
11     public class ModernPerson : Person
12     {
13         /**/
14         /// <summary>
15         /// 从外部获取工具
16         /// </summary>
17         public ITool Tool { get; set; }
18         /**/
19         /// <summary>
20         /// 现在人用不需要知道电脑是哪来的,直接拿来办公
21         /// </summary>
22         public override void Work()
23         {
24             //不知道使用什么工具和哪来的工具,只是机械化的办公
25             Tool.UseTool();
26             Console.WriteLine("使用工具办公");
27         }
28     }
29 }
 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3   <configSections>
 4     <sectionGroup name="spring">
 5       <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
 6       <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
 7     </sectionGroup>
 8   </configSections>
 9   <spring>
10     <context>
11       <!--容器配置-->
12       <resource uri="config://spring/objects"/>
13     </context>
14     <objects xmlns="http://www.springframework.net">
15       <!--这里放容器里面的所有节点-->
16       <description>An  example that demonstrates simple IoC features.</description>
17       <!--name 必须要唯一的,type=类的全名称,所在的程序集-->
18       <object name="computer" type="Dao.IOC.Computer,Dao">
19       </object>
20       <object name="modernPerson" type="Dao.IOC.ModernPerson, Dao">
21         <property name="Tool" ref="computer"/>
22       </object>
23     </objects>
24   </spring>
25   <startup>
26     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
27   </startup>
28 </configuration>
1  static void Main(string[] args)
2         {
3
4             IApplicationContext ctx = ContextRegistry.GetContext();
5             Person person = (Person)ctx.GetObject("modernPerson");
6             person.Work();
7             Console.ReadLine();
8         }

  从上面代码我们可以看出,把对象交给Spring.NET容器进行管理,ModernPerson类不需要知道具体使用什么工具,仅仅是机械化的工作。至于使用的什么工具,则由配置文件决定,所有对象由Spring.NET容器管理,这样可以实现动态的拆装组建和组件重用。我个人理解依赖注入是反射工厂的加强版。

时间: 2025-01-16 13:01:55

Spring.Net学习笔记五(依赖注入)的相关文章

Spring.Net学习笔记(2)-依赖注入

一.开发环境 操作系统:Win10 编译器:VS2013 framework版本:.net 4.5 Spring版本:1.3.1 二.涉及程序集 Spring.Core.dll Common.Loggin.dll 三.项目结构 四.开发过程 1.新建一个接口文件 namespace SpringNetIoc.IScene { public interface IBall { void DoSport(); } } 2.新建两个实现接口IBall的具体类 namespace SpringNetIo

Spring.Net学习笔记六(依赖对象的注入)

一.属性注入 上篇我们简单提到依赖注入的用途.回顾一下所讲内容,发现在object节点下使用了<property name="Tool" ref="computer"/>.而property 标签正是用来属性注入的.而ref是用来标识是关联到哪个object.而name属性是指属性名.如下: <object id="modernPerson" type="SpringNetIoC.ModernPerson, Sprin

AngularJS学习笔记之依赖注入

最近在看AngularJS权威指南,由于各种各样的原因(主要是因为我没有money,好讨厌的有木有......),于是我选择了网上下载电子版的(因为它不要钱,哈哈...),字体也蛮清晰的,总体效果还不错.但是,当我看到左上角的总页码的时候,479页....479....479....俺的小心脏被击穿了二分之一有木有啊,上半身都石化了有木有啊,那种特别想学但是看到页码又不想学的纠结的心情比和女朋友吵架了还复杂有木有啊,我平常看的电子书百位数都不大于3的好伐! 哎,原谅我吧,我应该多看几本新华字典习

Unity学习笔记(4):依赖注入

Unity具体实现依赖注入包含构造函数注入.属性注入.方法注入,所谓注入相当赋值,下面一个一个来介绍 1:构造函数注入 1.1当类有多个构造函数时,可以通过InjectionConstructor特性来指定某个构造函数来解析注入对象. [InjectionConstructor] public Student(IClass _class,string name) { ToClass = _class; Name = name; } 1.2构造函数中IClass参数,如果IUnityContain

Yii2 学习笔记 01 -- 依赖注入在yii2中的应用

什么是依赖注入?                  依赖注入(Dependency Injection)是设计模式的一种.名字比较抽象,但是,要解决的问题却是比较明确.对于给定的应用程序,需要借助一些相对独立的组件来完成功能.一般来说,使用这些组件的过程就包含在应用程序的逻辑语句之中.问题是,当这些组件想要做成类似插件功能,以达到应用程序的业务逻辑不变就能随意的更改组件的实现的效果.这种灵活性取决于应用程序如何组装这些组件.如果说应用程序依赖于这些组件的话,依赖注入就是把这些依赖关系从应用程序的

Spring.Net学习笔记(5)-集合注入

一.开发环境 系统:Win10 编译器:VS2013 .net版本:.net framework4.5 二.涉及程序集 Spring.Core.dll 1.3.1 Common.Loggin.dll 三.开发过程 1.项目结构 2.编写Person.cs namespace SpringNetSetDi { public class Person { public string RealName { get; set; } public string NickName { get; set; }

Spring.Net学习笔记(6)-方法注入

一.开发环境 系统:win10 编译器:VS2013 二.涉及程序集 Spring.Core.dll 1.3.1 Common.Logging.dll 三.开发过程 1.项目结构 2.编写Mobile.cs namespace SpringNetMethodDi { public abstract class Mobile { //可以是virtual public abstract SendTool GetSendTool(); } } 3.编写SendTool.cs namespace Sp

angular2 学习笔记 ( DI 依赖注入 )

refer : http://blog.thoughtram.io/angular/2016/09/15/angular-2-final-is-out.html ( search Dependency Injection ) 小说明 : 大致流程 : 把 providers 写入 injector, 然后通过 injector 来注入 service. 单列 : 一个 service 在一个 injector 里是单列. 查找逻辑 : injector 有父子关联, 如果子 injector 没

Spring MVC 学习笔记(二):@RequestMapping用法详解

一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置 <servlet>     <servlet-name>servletName</servlet-name>     <servlet-class>ServletClass</servlet-class> </servlet>