接触依赖注入

Posted Q & L

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接触依赖注入相关的知识,希望对你有一定的参考价值。

依赖注入(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

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

以上是关于接触依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

Android片段和依赖注入

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

《Effective Java》 读书笔记使用依赖注入取代原本的资源依赖

依赖注入

Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系

Autofac--手动依赖注入