控制反转IOC与依赖注入DI

一、名词解释

IoC:Inverse of control,控制反转;

DI:Depedency Injection 依赖注入

IoC和DI是从不同角度描述同一件事情,即DI模式是Ioc的具体实现方式,通过引入IoC容器,利用依赖关系注入,实现对象的解耦。

二、问题引入

先来看普通的方式:

[csharp] view plain copy print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace IocDemo  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             UserService user = new UserService(1);  
  13.             user.SaveUser();  
  14.   
  15.             Console.Read();  
  16.         }  
  17.     }  
  18.     interface IDal  
  19.     {  
  20.         void save();  
  21.     }  
  22.     class SqlServerDal : IDal  
  23.     {  
  24.         public void save()  
  25.         {  
  26.             Console.WriteLine("SqlServer save.");  
  27.         }  
  28.     }  
  29.     class OracleDal : IDal  
  30.     {  
  31.         public void save()  
  32.         {  
  33.             Console.WriteLine("Oracle save.");  
  34.         }  
  35.     }  
  36.   
  37.     class UserService  
  38.     {  
  39.         private IDal dal;  
  40.         public UserService(int type)  
  41.         {  
  42.             if (type == 1)  
  43.                 dal = new OracleDal();  
  44.             else  
  45.                 dal = new SqlServerDal();  
  46.         }  
  47.         public void SaveUser()  
  48.         {  
  49.             dal.save();  
  50.         }  
  51.     }  
  52. }  


我们发现UserService和具体的类OracleDal,SqlserverDal紧密耦合。

如果把它进行简单的修改,那么UserService就和具体的类没有关系了,而是直接依赖于抽象。

[csharp] view plain copy print ?
  1. class UserService  
  2.     {  
  3.         private IDal dal;  
  4.         public UserService(IDal dal)  
  5.         {  
  6.             this.dal = dal;  
  7.         }  
  8.         public void SaveUser()  
  9.         {  
  10.             dal.save();  
  11.         }  
  12.     }  
  13. }  


那么运行时具体的类是哪个呢?这是我们就可以事先注册好一种对于关系,
先看一段Unity的代码混个眼熟:

[csharp] view plain copy print ?
  1. UnityContainer container = new UnityContainer();  
  2. container .RegisterType<IDal, OracleDal>();  


通过解析对应关系可以知道IDal具体的类。调用时:

[csharp] view plain copy print ?
  1. var dal = container .Resolve<IDal>();//这是得到OracleDal的实例。  
  2. UserService user = new UserService(dal);  
  3. user.SaveUser();  


可见DI的目的其实就是为了减少对象间的依赖性,降低模块间的耦合度。

 

 

三、优缺点

优点:实现松耦合;

缺点:对性能有一定损失,不过现在各个产品都进行了优化升级,目前性能已经相差不会太大了。

四、IoC相关产品

Unity,Autofac,Castle,Munq,Funq,Ninject,windsor,StructMap

在后面的系列中将介绍其中几种Ioc容器。


你可能感兴趣的:(控制反转IOC与依赖注入DI)