zoukankan      html  css  js  c++  java
  • 接触依赖注入

    依赖注入(IOC)

    以前做小项目的时候用到过,但不知道是什么原理,糊里糊涂的就用了。

    今天特意来查一下原因的,找了很多,大部分太深奥不适合我这种初入新手,偶然看到了这篇

    http://www.cnblogs.com/yriyr/archive/2010/01/29/1659143.html

    作者好像也是转载的,推荐可以去原作看看。

    这里边的代码样例通俗易懂,适合入门的人看


    2017-06-07 更新

    构造注入

    另外一种依赖注入方式,是通过客户类的构造函数,向客户类注入服务类实例。

    构造注入(Constructor Injection)是指在客户类中,设置一个服务类接口类型的数据成员,并以构造函数为注入点,这个构造函数接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。

    图3.3 构造注入示意

    图3.3是构造注入的示意图,可以看出,与Setter注入很类似,只是注入点由Setter方法变成了构造方法。这里要注意,由于构造注入只能在实例化客户类时注入一次,所以一点注入,程序运行期间是没法改变一个客户类对象内的服务类实例的。

    由于构造注入和Setter注入的IServiceClass,ServiceClassA和ServiceClassB是一样的,所以这里给出另外ClientClass类的示例代码。

    Code:ClientClass
       1: using System;
       2: using System.Collections.Generic;
       3: using System.Linq;
       4: using System.Text;
       5:  
       6: namespace ConstructorInjection
       7: {
       8:     internal class ClientClass
       9:     {
      10:         private IServiceClass _serviceImpl;
      11:  
      12:         public ClientClass(IServiceClass serviceImpl)
      13:         {
      14:             this._serviceImpl = serviceImpl;
      15:         }
      16:  
      17:         public void ShowInfo()
      18:         {
      19:             Console.WriteLine(_serviceImpl.ServiceInfo());
      20:         }
      21:     }
      22: }

    Setter注入

    Setter注入(Setter Injection)是指在客户类中,设置一个服务类接口类型的数据成员,并设置一个Set方法作为注入点,

    这个Set方法接受一个具体的服务类实例为参数,并将它赋给服务类接口类型的数据成员。

    图3.1 Setter注入示意

    上图展示了Setter注入的结构示意图,客户类ClientClass设置IServiceClass类型成员_serviceImpl,

    并设置Set_ServiceImpl方法作为注入点。Context会负责实例化一个具体的ServiceClass,然后注入到ClientClass里。

    下面给出Setter注入的示例代码。

    Code:IServiceClass
     
       1: using System;
       2: using System.Collections.Generic;
       3: using System.Linq;
       4: using System.Text;
       5:  
       6: namespace SetterInjection
       7: {
       8:     internal interface IServiceClass
       9:     {
      10:         String ServiceInfo();
      11:     }
      12: }
    Code:ServiceClassA
       1: using System;
       2: using System.Collections.Generic;
       3: using System.Linq;
       4: using System.Text;
       5:  
       6: namespace SetterInjection
       7: {
       8:     internal class ServiceClassA : IServiceClass
       9:     {
      10:         public String ServiceInfo()
      11:         {
      12:             return "我是ServceClassA";
      13:         }
      14:     }
      15: }
    Code:ServiceClassB
       1: using System;
       2: using System.Collections.Generic;
       3: using System.Linq;
       4: using System.Text;
       5:  
       6: namespace SetterInjection
       7: {
       8:     internal class ServiceClassB : IServiceClass
       9:     {
      10:         public String ServiceInfo()
      11:         {
      12:             return "我是ServceClassB";
      13:         }
      14:     }
      15: }
    Code:ClientClass
       1: using System;
       2: using System.Collections.Generic;
       3: using System.Linq;
       4: using System.Text;
       5:  
       6: namespace SetterInjection
       7: {
       8:     internal class ClientClass
       9:     {
      10:         private IServiceClass _serviceImpl;
      11:  
      12:         public void Set_ServiceImpl(IServiceClass serviceImpl)
      13:         {
      14:             this._serviceImpl = serviceImpl;
      15:         }
      16:  
      17:         public void ShowInfo()
      18:         {
      19:             Console.WriteLine(_serviceImpl.ServiceInfo());
      20:         }
      21:     }
      22: }
    Code:Context
       1: using System;
       2: using System.Collections.Generic;
       3: using System.Linq;
       4: using System.Text;
       5:  
       6: namespace SetterInjection
       7: {
       8:     class Program
       9:     {
      10:         static void Main(string[] args)
      11:         {
      12:             IServiceClass serviceA = new ServiceClassA();
      13:             IServiceClass serviceB = new ServiceClassB();
      14:             ClientClass client = new ClientClass();
      15:  
      16:             client.Set_ServiceImpl(serviceA);
      17:             client.ShowInfo();
      18:             client.Set_ServiceImpl(serviceB);
      19:             client.ShowInfo();
      20:         }
      21:     }
      22: }

    运行结果如下:

    图3.2 Setter注入运行结果

     

    这是其中一段,依赖注入的思想是消除聚合(应该是这个意思,目前还在学习中)。通过多个类继承接口,ClientClass中定义注入点,注入接口后在Context实例化具体的类进行实现。

    目前就这么多了,学习后继续整理

    PS:仅作为学习总结和推荐作用,本人对依赖注入的理解只是入门,会有偏差,不要被我带坏了

     

    ----------------------------end

    time:2017-06-07

    高考时间,诸位考生加油,虽然你们并看不到

  • 相关阅读:
    PLECS—晶闸管-第九周
    第五六周读书笔记
    PLEC-交流电机系统+笔记
    直流电机交流电机读书笔记-4
    PLECS—直流电机系统2
    自动化技术中的进给电气传动-读书笔记3
    文档保存
    TensorFlow安装教程(CPU版)
    团队项目开发日志--(第四篇)
    团队项目开发日志--(第三篇)
  • 原文地址:https://www.cnblogs.com/yishilin/p/6956112.html
Copyright © 2011-2022 走看看