• 控制反转和依赖注入


    edit date: 2019-9-24 19:20:34

    0x00 写在前面

    之前听过一句话,设计模式是药,不要乱吃……

    代码的功能化与模块化。

    修改某一部分的代码,不应该导致其他意外的位置出现错误。

    依赖注入(Dependency Injection, DI)通常会与控制反转(Inversion of Control, IoC)一同出现,从去年接触了一点框架的时候,才听到这个新鲜东西,说起来,他们其实是一回事。

    0x02 IoC

    控制反转,是一种设计理念, 是一个设计的原理,他也被叫做好莱坞原则:不要给我们打电话;我们会给你打电话。

    0x01 DI

    依赖注入就是为了减少模块之间的耦合,

    依赖注入是允许从类的外部注入依赖项,因此注入的类只需要实现了必须的功能(通常是接口),这就可是让注入的依赖项独立于对象的创建。

    先看一个简单的打印功能的实现,没有使用依赖注入。

    public class GreetingService
    {
        public string Greet(string name) => $"Hello, {name}";
    }
    
    • 1
    • 2
    • 3
    • 4
    public class HomeController
    {
        public string Hello (string name)
        {
            var service = new GreetingService();
            return service.Greet(name);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    static void Main()
    {
        var controller = new HomeController();
        string result = controller.Hello("Stephanie");
        Console.WriteLine(result);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果想要对 HomeController 进行测试,或对实现方式进行修改,都需要对紧密耦合的另一部分进行修改,单独修改是很不容易的。

    如果使用依赖注入的方式实现上面的功能:

    public interface IGreetingService
    {
        string Greet(string name);
    }
    
    • 1
    • 2
    • 3
    • 4
    public class GreetingService : IGreetingService
    {
        public string Greet(string name) => $"Hello, {name}";
    }
    
    • 1
    • 2
    • 3
    • 4
    public class HomeController
    {
        private readonly IGreetingService _greetingService;
        public HomeController (IGreetingService greetingService)
        {
            _greetingService = greetingService ?? throw new ArgumentNullException (nameof(greetingService));
        }
        public string Hello(string name) => _greetingService.Greet(name);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    static void Main()
    {
        var controller = new HomeController(new GreetingService());
        string result = controller.Hello("Matthias");
        Console.WriteLine(result);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    HomeController 的实现在没有依赖接口 IGreetingService 的具体实现。这是典型的构造函数注入的依赖注入模式。

    0xff

    挣脱套鹿。

  • 相关阅读:
    浅谈MDK, IAR,CLANG和GCC的局部变量字节对齐处理差异(2023-10-13)
    如何使用 Redis 缓存
    代码随想录算法训练营第29天 |第七章 回溯算法part05
    springmvc1:初探springmvc
    不用代码,将数据POST到Domino应用中
    Qt/C++开源作品45-CPU内存显示控件/和任务管理器一致
    Acwing3426. 糖果分享游戏
    【Docker】 08-Dockerfile
    【Swift 60秒】11 - Tuples
    怎么把多张图片合成gif?教你简单几步快速制作gif
  • 原文地址:https://blog.csdn.net/ShihEuan/article/details/126301943