其他分享
首页 > 其他分享> > 为什么使用依赖注入和控制反转

为什么使用依赖注入和控制反转

作者:互联网

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。

依赖注入(Dependency Injection,简称DI)则是一种实现控制反转的方法。

理解了依赖注入,就理解了控制反转

依赖注入

依赖项是指一个对象所依赖的对象。

public class IndexController : Controller
{
    private readonly Dependency _dependency = new Dependency();

    public IActionResult Index()
    {
        _dependency.WriteMessage("message");
        return null;
    }
}

public class Dependency
{
    public void WriteMessage(string message)
    {
        Console.WriteLine(message);
    }
}

在以上代码中,在类IndexController中直接实例化了Dependency对象,并调用其WriteMessage方法。

那么Dependency就是IndexController的依赖项。这样的直接依赖会产生问题,应避免使用,原因如下:

依赖注入通过以下方式解决这些问题:

Dependency类抽象成接口IDependency

public interface IDependency
{
    void WriteMessage(string message);
}

Dependency实现接口IDependency

public class Dependency : IDependency
{
    public void WriteMessage(string message)
    {
        Console.WriteLine(message);
    }
}

通过Startup类的ConfigureServices方法,在服务容器中注册具体类型 为DependencyIMyDependency 服务。AddScoped表示使用范围内生命周期注册服务。

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IDependency, Dependency>();
    services.AddControllersWithViews();
}

IndexController中注入IDependency服务并调用WriteMessage方法

public class IndexController : Controller
{
    private readonly IDependency _dependency;

    public IndexController(IDependency dependency)
    {
        this._dependency = dependency;
    }

    public IActionResult Index()
    {
        _dependency.WriteMessage("message");
        return null;
    }
}

通过使用依赖注入模式,类IndexController:

控制反转

那么到底什么被反转了?获得依赖对象的过程被反转了。

在以上的例子中,IndexController获得Dependency对象的过程被反转了。以往是IndexController直接实例化Dependency对象,现在是由服务容器实例化,并通过IndexController的构造函数注入。

ASP.NET Core依赖注入

在我之前的文章中有详细介绍

参考

ASP.NET Core 依赖注入

控制反转

标签:IDependency,依赖,反转,Dependency,WriteMessage,IndexController,public,注入
来源: https://www.cnblogs.com/hzhhhbb/p/Why_use_dependency_injection_and_inversion_of_control.ht