控制反转IOC与依赖注入DI

2 篇文章 0 订阅
2 篇文章 0 订阅

一、名词解释

IoC:Inverse of control,控制反转;

DI:Depedency Injection 依赖注入

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

二、问题引入

先来看普通的方式:

  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就和具体的类没有关系了,而是直接依赖于抽象。

  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的代码混个眼熟:

  1. UnityContainer container = new UnityContainer();  
  2. container .RegisterType<IDal, OracleDal>();  


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

  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容器。


Elite Container是DELPHI下的一个轻量级IoC对象容器(IoC:Inverse of Control,反转控制)。它是参考了Java中的Spring框架(主要是配置文件的写法),并结合DELPHI的特点来构建的。相比Spring的对象容器,它提供的功能更为精简常用(如对象延迟创建、对象属性自动注入等),降低了学习的难度,并且提供了很多扩展点,你只需简单地写一个插件实现类,并在配置文件中进行简单配置,就可以让Elite Container拥有你的自定义功能! 借助Elite Container和Ioc思想,你可以更轻易地构建出具有松散耦合、重用度高的应用程序。它的核心思想就是拆分功能的接口和实现,上层只依赖于下层的接口,然后通过Elite Container的配置,把不同的实现类注入到该接口中,达到更换功能,也就是复用已有代码的目的。设计人员可以真正地发挥好自己的面向对象思想和相关设计模式,来架构企业级的应用程序,而无需象以前那样,在Delphi中用起面向对象总有点捉襟见袖的感觉。 ps. 由于写程序,还有精心准备的26个例子,都花费了我很多的时间,所以象征性地收2个资源分,希望大家不会介意:) ps2. 说明一下,开发出来的程序在发布的时候,除了发布EliteCore.bpl、EliteContainer.bpl外,还需要发布rtl.bpl(EliteCore.bpl引用到了它)。由于一时疏忽,例子中的Bin目录里忘记带上它了,请大家注意,谢谢~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值