C#面向对象编程中依赖反转原则的示例详解

 更新时间:2022年07月26日 11:35:52   作者:技术译民  
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。本文将通过实例详细讲讲C#面向对象编程中依赖反转原则,需要的可以参考一下

在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原则的子集,在他2000年的论文《设计原则与设计模式》中首次提出。

SOLID 原则包含:

本文我们来介绍依赖反转原则。

依赖反转原则

在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦形式,使得高层次的模块不依赖于低层次模块的实现细节,依赖关系被颠倒(反转),从而使低层次模块依赖于高层次模块的需求抽象。(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)

(图1 中,高层 对象A 依赖于低层 对象B 的实现;图2 中,把高层 对象A 对低层对象的需求抽象为一个 接口A,低层 对象B 实现了 接口A,这就是依赖反转。)

依赖反转原则约定:

  • 高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。
  • 抽象接口不应该依赖于具体实现。而具体实现则应该依赖于抽象接口。

该原则颠倒了一部分人对于面向对象设计的认识方式(如高层次和低层次对象都应该依赖于相同的抽象接口)。

依赖注入是该原则的一种实现方式。

C# 示例

先定义一个商品信息类:

public class ProductInfo
{
    public int ID { get; set; }
    public string ProductName { get; set; }
    public string ProductSpec { get; set; }
    public int Stock { get; set; }
}

糟糕的示范

新建一个数据访问类 ProductDataAccess 和业务逻辑类 ProductBusinessLogic:

public class ProductDataAccess
{
    public ProductInfo GetDetail(int id)
    {
        ProductInfo product = new()
        {
            ID = id,
            ProductName = "白糖",
            ProductSpec = "500g",
            Stock = 100
        };
        return product;
    }
}

public class ProductBusinessLogic
{
    private readonly ProductDataAccess _productDataAccess;
    public ProductBusinessLogic()
    {
        _productDataAccess = new ProductDataAccess();
    }

    public ProductInfo GetProductDetails(int id)
    {
        return _productDataAccess.GetDetail(id);
    }
}

在上面的代码中,高层次的类 ProductBusinessLogic 直接依赖于低层次的类 ProductDataAccess,这明显违反了 依赖反转原则。

正确的示范

根据 依赖反转原则 的要求,我们把高层对象 ProductBusinessLogic 对低层对象的需求抽象为一个接口 IProductDataAccess:

public interface IProductDataAccess
{
    ProductInfo GetDetail(int id);
}

在低层对象 ProductDataAccess 中实现接口 IProductDataAccess,然后在高层对象 ProductBusinessLogic 中引用(注入)接口 IProductDataAccess:

public class ProductDataAccess : IProductDataAccess
{
    public ProductInfo GetDetail(int id)
    {
        ProductInfo product = new()
        {
            ID = id,
            ProductName = "白糖",
            ProductSpec = "500g",
            Stock = 100
        };
        return product;
    }
}

public class ProductBusinessLogic
{
    private readonly IProductDataAccess _productDataAccess;
    public ProductBusinessLogic(IProductDataAccess productDataAccess)
    {
        _productDataAccess = productDataAccess;
    }

    public ProductInfo GetProductDetails(int id)
    {
        return _productDataAccess.GetDetail(id);
    }
}

这样,这些类的设计便遵守了依赖反转原则。

其实,ASP.NET Core 中服务的依赖注入正是遵循了依赖反转原则。

总结

本文我介绍了 SOLID 原则中的依赖反转原则(Dependency inversion principle),并通过 C# 代码示例简明地诠释了它的含意和实现,希望对您有所帮助。

到此这篇关于C#面向对象编程中依赖反转原则的示例详解的文章就介绍到这了,更多相关C#依赖反转原则内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Unity实现局域网聊天室功能

    Unity实现局域网聊天室功能

    这篇文章主要为大家详细介绍了Unity实现局域网聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Unity平台模拟自动挡驾驶汽车

    Unity平台模拟自动挡驾驶汽车

    这篇文章主要为大家详细介绍了Unity平台模拟自动挡驾驶汽车,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • .net中常用的正则表达式

    .net中常用的正则表达式

    这篇文章介绍了.net中常用的正则表达式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#实现彻底删除文件的方法

    C#实现彻底删除文件的方法

    这篇文章主要介绍了C#实现彻底删除文件的方法,可实现类似360粉碎文件的效果,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • C#中Winform获取文件路径的方法实例小结

    C#中Winform获取文件路径的方法实例小结

    这篇文章主要介绍了C#中Winform获取文件路径的方法,以实例形式较为详细的总结了WinForm关于路径操作的常用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • C#桥接模式完整实例

    C#桥接模式完整实例

    这篇文章主要介绍了C#桥接模式,以实例形式较为详细的分析了C#桥接模式的实现原理与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 在.NET中读取嵌入和使用资源文件的方法

    在.NET中读取嵌入和使用资源文件的方法

    本文分别介绍了使用GetManifestResourceStream读取嵌入资源,和使用. resx资源文件嵌入资源,希望对大家有所帮助。
    2016-05-05
  • 详解C#开发Android应用程序的流程

    详解C#开发Android应用程序的流程

    在本篇文章里小编给大家分享了关于C#开发Android应用程序的流程和相关技巧,需要的朋友们跟着学习下。
    2019-03-03
  • C#并发容器之ConcurrentDictionary与普通Dictionary带锁性能详解

    C#并发容器之ConcurrentDictionary与普通Dictionary带锁性能详解

    这篇文章主要介绍了C#并发容器之ConcurrentDictionary与普通Dictionary带锁性能详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • C#中使用Lambda表达式自定义比较器实现两个列表合并实例

    C#中使用Lambda表达式自定义比较器实现两个列表合并实例

    这篇文章主要介绍了C#中使用Lambda表达式自定义比较器实现两个列表的合并实例,本文给出示例代码和运行效果,需要的朋友可以参考下
    2014-10-10

最新评论