控制反转IOC与依赖注入DI

本文介绍了IoC(控制反转)和DI(依赖注入)的概念及其应用,通过示例对比展示了如何利用DI模式实现对象间解耦,降低模块耦合度,并讨论了其优缺点及常见IoC容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、名词解释

IoC:Inverse of control,控制反转;

DI:Depedency Injection 依赖注入

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

二、问题引入

先来看普通的方式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IocDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            UserService user = new UserService(1);
            user.SaveUser();

            Console.Read();
        }
    }
    interface IDal
    {
        void save();
    }
    class SqlServerDal : IDal
    {
        public void save()
        {
            Console.WriteLine("SqlServer save.");
        }
    }
    class OracleDal : IDal
    {
        public void save()
        {
            Console.WriteLine("Oracle save.");
        }
    }

    class UserService
    {
        private IDal dal;
        public UserService(int type)
        {
            if (type == 1)
                dal = new OracleDal();
            else
                dal = new SqlServerDal();
        }
        public void SaveUser()
        {
            dal.save();
        }
    }
}


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

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

class UserService
    {
        private IDal dal;
        public UserService(IDal dal)
        {
            this.dal = dal;
        }
        public void SaveUser()
        {
            dal.save();
        }
    }
}


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

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


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

var dal = container .Resolve<IDal>();//这是得到OracleDal的实例。
UserService user = new UserService(dal);
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目录里忘记带上它了,请大家注意,谢谢~
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值