`
spark_li
  • 浏览: 20796 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

为什么我们需要IOC框架, 与依赖倒置原则有什么关系?

阅读更多

大部分企业应用开发和互联网项目的开发都在应用IOC框架。

但是大部分时候,我们也就是这么用用,很少人有去考虑用的到底对不对,合适不合适。

 

大家都知道依赖倒置原则,这里给出定义:

高层模块不能依赖于底层模块,两者都应该依赖于抽象。

 

是不是有点颠覆三观!! 难道业务层不应该依赖数据访问层吗。难道是数据访问层依赖业务层吗?

 

下面是一个最常见的设计,业务层依赖 数据访问层,远程调用,文件访问,log模块等等:

这种设计被称之为 Naive Design。 一旦业务层依赖的任何一个模块发生变化,都会影响到业务层。变化通常是引入错误的原因。

那么我们以依赖倒置的原则来重新设计,得到下图中的结构:



 这样是不是业务层就非常独立了。
 但是,是不是有点晕了。这是怎么做到的呢? 来看一段简单的示例:

namespace Business
{
    public class OrderService
    {
        private readonly IOrderRepository _orderRepository;

        public OrderService(IOrderRepository orderRepository)
        {
            _orderRepository = orderRepository;
        }


        public Void CreateOrder()
        {
            var order =  new Order();

            _orderRepository.SaveOrder(order);
        }
    }
}

这段代码表示创建订单时,调用数据访问层把order对象持久化。

再来看一下项目结构:



可以看到 Business 没有依赖任何工程,DataAccess依赖了Business,Client也就是OrderService的调用方,同时依赖了Business和DataAccess。

 

你可能已经注意到了, IOrderRepository的接口定义在Business中,而在DataAccess中实现了这个接口。这样就实现了依赖倒置。这样做有什么好处呢,因为IOrderRepository接口的使用是Business提出来的,它只需要知道我要使用这个接口,而不用关心实现,这样就把实现的变化封装在了DataAccess中。这也体现了OO设计中最重要的两个原则:封装变化,面向接口编程。

 

在使用OrderService的地方,也就是client中,我们创建一个OrderRepository,并作为OrderService的参数传入。代码如下:

        static void Main(string[] args)
        {
            var orderRepository = new OrderRepository();

            var orderService = new OrderService(orderRepository);
        }

为什么不让OrderService自己创建OrderRepository呢?这样明显会导致双向依赖么。

 

每次创建OrderService的时候都要new一下OrderRepository,烦不烦。于是就有了IOC框架,帮我们自动创建一个OrderRepository,并注入OrderService。

 

回头再想想,如果你的项目是正向依赖关系。用IOC框架有意义么? 达到解耦的目的了么?

  • 大小: 24.7 KB
  • 大小: 23.5 KB
  • 大小: 22.5 KB
分享到:
评论

相关推荐

    依赖倒置+控制反转+依赖注入+面向接口编程

    在软件设计领域,依赖倒置、控制反转、依赖注入以及面向接口编程是四个非常重要的概念,它们都是现代软件开发中的核心原则,特别是对于构建可扩展、可维护的系统至关重要。 首先,我们来深入理解一下“依赖倒置”...

    向依赖关系宣战--依赖倒置、控制反转和依赖注入辨析

    依赖倒置、控制反转和依赖注入是面向对象编程中...在实践中,我们可以结合具体的情况选择合适的策略,比如使用依赖注入框架来自动管理依赖关系,或者通过设计良好的接口来实现依赖倒置,以实现软件的高质量和高效率。

    PHP面向对象五大原则之依赖倒置原则(DIP)详解

    依赖倒置原则与控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)有着密切的关系。控制反转是一种设计思想,它将控制权从代码自身转移到外部环境。而依赖注入则是一种实现控制反转的...

    Spring IoC加载流程讲解

    在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从代码控制剥离到容器控制。这样...

    依赖注入IOC

    4. **促进开闭原则的应用**:依赖倒置原则有助于实现开闭原则(Open/Closed Principle, OCP),即软件实体应当对扩展开放,对修改关闭。 #### 四、控制反转(IOC) 控制反转是一种用于减少程序组件间耦合的技术,...

    基于JAVA的IOC/DI框架的设计与实现

    而依赖倒置原则通过将上层模块所需要的方法提取并定义为接口,使得上层模块仅针对接口进行编程,而下层模块则根据这个接口的定义来决定自己的实现方式。这种做法打破了原有的依赖关系,实现了依赖的倒置。 **1.1.2 ...

    MVC使用Spring.Net应用IOC(依赖倒置)学习笔记3

    为了遵循依赖倒置原则,我们需要引入IOC(Inversion of Control)容器,如Spring.Net,来管理对象的生命周期和依赖关系。 Spring.Net是一个强大的.NET框架,提供了IOC容器功能。在控制台应用程序中使用Spring.Net,...

    Spring的IOC原理

    Martin Fowler将IOC进一步阐述为依赖注入(Dependency Injection,简称DI)。DI关注的是依赖对象的获取过程被反转,即原本由对象自身负责获取其依赖的对象,现在改由外部容器负责注入。对象只需要声明其依赖,无需...

    计算机课程(软件工程)-软件设计原则.docx

    3. 反转控制(Inversion of Control, IoC):依赖倒置原则的一个实现方式是IoC,它使得容器(如Spring框架)负责管理对象的生命周期和依赖关系,而不是由对象自身来管理。 遵循依赖倒置原则的好处: 1. 提高可维护...

    Springioc注入Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器来负责,从而实现了依赖倒置,增强了代码的可测试性和可维护性。DI(Dependency Injection,依赖注入)...

    反射及IOC实现灵活插件架构

    IOC,又称为依赖倒置原则,是一种设计模式,它强调组件之间的依赖关系应由容器管理,而不是由组件自身负责。在Java中,Spring框架是实现IOC的典型代表。通过IOC,我们可以将组件的依赖关系解耦,使得组件更易于测试...

    .NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)

    依赖倒置原则(DIP)是面向对象设计的重要原则之一,它的核心思想是降低模块间的耦合度,使得软件系统的各个部分能够独立变化和发展。DIP强调高层次的模块不应该依赖低层次的模块,而是两者都应该依赖它们共同的抽象,...

    JAVA架构设计原则与J2EE必读书目推荐

    5. **依赖倒置原则**:依赖倒置原则建议依赖抽象而非具体实现。这意味着高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。这种做法可以提高系统的灵活性和可扩展性...

    你知道软件设计的6大原则吗?S.O.L.I.D.设计原则

    **趣图解析**:依赖倒置原则的图解通常会展示高层模块如何依赖于抽象,而具体的实现则依赖于这些抽象。 ##### 6. 依赖注入(Dependency Injection, DI)和控制反转(Inversion of Control, IoC) **定义**:依赖...

    绝对深层次IOC和AOP的理解

    在Spring框架中,IOC通过Spring IOC容器来实现,容器负责对象的创建、依赖关系的管理以及注入。Spring支持通过XML配置、注解或Java配置来定义对象及其依赖关系。 实现IOC的主要设计模式是工厂模式。工厂模式是一种...

    go-simple-ioc:Golang 的简单 IoC 容器

    依赖倒置和依赖注入根据 Robert Martin 的说法,依赖倒置有一些定义: 高级模块不应该依赖于低级模块。 两者都应该取决于抽象。 抽象不应该依赖于细节。 细节应取决于抽象。 通过使用抽象(Golang 中的接口),依赖...

    CustomIoC.zip

    依赖注入(Dependency Injection,简称DI)是一种设计模式,它允许我们解耦代码,使得系统更加模块化,易于...通过这种方式,我们可以构建更灵活、可维护的系统,遵循面向接口编程和依赖倒置原则,从而提升代码质量。

Global site tag (gtag.js) - Google Analytics