zoukankan      html  css  js  c++  java
  • Spring.NET学习笔记6——依赖注入(应用篇)

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

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

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

    一.接口接受但是个直接耦合

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

    二。工厂解耦 但代码改变的时候工厂里的代码要随着更改 不同业务要new 出许多的工厂仍然是个shit

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

    复制代码
    2. public static class ToolFactory
        {
            /// <summary>
            /// 工厂制造工具
            /// </summary>
            /// <returns></returns>
            public static ITool CreateTool()
            {
                return new Hoe();  // 制造锄头
            }
        }
    3.
        public class EconomyPerson : Person
        {
            /// <summary>
            /// 经济社会使用锄头耕作
            /// </summary>
            public override void Work()
            {
                //不用知道什么工具,只需知道工厂能买到工具,而不自己制造工具,但仅由工厂制造锄头
                ITool tool = ToolFactory.CreateTool();
                tool.UseTool();
                Console.WriteLine("经济社会使用工具耕作");
            }
        }
    三.彻底解耦
    1.   public class Computer : ITool
        {
            public void UseTool()
            {
                Console.WriteLine("使用电脑");
            }
        }
    复制代码
    2.直接属性注入连工具是什么都不用知道 只提供接口 
    public class ModernPerson : Person
        {
            /// <summary>
            /// 从外部获取工具
            /// </summary>
            public ITool Tool { get; set; }

            /// <summary>
            /// 现在人用不需要知道电脑是哪来的,直接拿来办公
            /// </summary>
            public override void Work()
            {
                //不知道使用什么工具和哪来的工具,只是机械化的办公
                Tool.UseTool();
                Console.WriteLine("使用工具办公");
            }
        }



        public interface ITool
        {
            /// <summary>
            /// 使用工具
            /// </summary>
            void UseTool();
        }

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

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

    5.
        public class PrimitivePerson : Person
        {
            /// <summary>
            /// 原始社会使用长矛打猎
            /// </summary>
            public override void Work()
            {
                //知道打猎使用的是长矛,并且制造长矛
                ITool tool = new Spear(); 客户端与spear直接耦合就是个shit
                tool.UseTool();
                Console.WriteLine("使用长矛打猎");
            }
        }

    6.使用配置文件解耦高级多了

    <?xml version="1.0" encoding="utf-8" ?>
    <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>

      <spring>

        <context>
          <resource uri="config://spring/objects" />
        </context>

        <objects xmlns="http://www.springframework.net">
          <description>一个简单的控制反转例子</description>


          <object id="computer" type="SpringNetIoC.Computer, SpringNetIoC" />

          <object id="modernPerson" type="SpringNetIoC.ModernPerson, SpringNetIoC">
            <property name="Tool" ref="computer"/>
          </object>


        </objects>

      </spring>

    </configuration>

    7.找个人工作就行了 用什么工作已经看不出了
        class Program
        {
            static void Main(string[] args)
            {
                IApplicationContext ctx = ContextRegistry.GetContext();
                Person person = (Person)ctx.GetObject("modernPerson");
                person.Work();

                Console.ReadLine();
            }
        }

  • 相关阅读:
    关于JQ的$.deferred()
    JS去掉数组的重复项
    JS中iframe相关的window.self,window.parent,window.top
    JQ的live(),on(),deletage(),bind()几个的区别
    个人对闭包的理解
    ajax 代码
    Don't use runAllManagedModulesForAllRequests="true" when getting your MVC routing to work
    SQL语句收集
    性能速度
    ADO.NET(SqlConnection、SqlCommand、SqlDataAdapter、SqlTransaction、SqlParameter、DataSet)
  • 原文地址:https://www.cnblogs.com/kexb/p/4359380.html
Copyright © 2011-2022 走看看