控制反转和依赖注入

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}";
}
public class HomeController
{
    public string Hello (string name)
    {
        var service = new GreetingService();
        return service.Greet(name);
    }
}
static void Main()
{
    var controller = new HomeController();
    string result = controller.Hello("Stephanie");
    Console.WriteLine(result);
}

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

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

public interface IGreetingService
{
    string Greet(string name);
}
public class GreetingService : IGreetingService
{
    public string Greet(string name) => $"Hello, {name}";
}
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);
}
static void Main()
{
    var controller = new HomeController(new GreetingService());
    string result = controller.Hello("Matthias");
    Console.WriteLine(result);
}

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

0xff

挣脱套鹿。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值