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

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

  • 相关阅读:
    个人理解的块状格式化上下文
    行框与浮动与清除浮动
    关于offset,scroll,position
    C++常用字符串操作和UTF-8和GBK之间的转换以及判定(转)
    MFC使用LoadBitmap方法加载位图文件失败解决方案(转)
    MFC在子线程中创建窗口(PostMessage方法)
    MFC线程间消息传递(转)
    MFC对话框常用操作文章收藏
    C++ 跨dll传递string类型参数执行出错问题
    C++ windows API函数末尾A和W的意义(转)
  • 原文地址:https://www.cnblogs.com/yishilin/p/6956112.html
Copyright © 2011-2022 走看看