您的位置:

.NET依赖注入详解

一、什么是依赖注入(DI)?

依赖注入是一种面向对象设计技巧。通过将对象的依赖关系移动到需要依赖它们的对象的构造函数中,DI让对象更加解耦,使得软件更容易维护、测试和重用。

二、什么是控制反转(IoC)?

控制反转是依赖注入背后的原则。它可以被解释为创建对象的过程被反转了。传统上,在应用程序中,对象是通过直接调用其构造函数或工厂方法来创建的。而在IoC容器中,创建过程由容器控制,它在需要时主动向应用程序提供所需的对象。

三、IoC容器的两种类型

IoC容器可以分为两种类型:

1、外部容器:外部容器是一些可用的IoC容器,如Autofac、Unity、StructureMap等。外部容器提供了一个依赖管理体系,可以用来管理企业系统中的所有依赖。在使用外部容器时,需要将容器框架添加到项目中,并编写配置文件以注册依赖。

2、内部容器:内部容器是应用程序自身实现的依赖注入容器。ASP.NET Core中的IServiceProvider是一个内部容器,它可以通过添加依赖关系服务来注册依赖项,并通过构造函数注入。

四、使用依赖注入和控制反转的好处

1、减少了代码的耦合,使得应用程序的可测试性更好。

2、依赖注入也可以实现AOP,让代码更具可扩展性。

3、使用IoC容器可以管理对象的实例化和生命周期,提高了代码的复用性。

4、使用IoC容器可以更容易地实现非线性依赖关系。

5、能够将一些配置、数据等信息集中管理,提高应用整体性能。

五、.NET Core中的依赖注入

ASP.NET Core中使用Microsoft.Extensions.DependencyInjection命名空间来实现依赖注入。ServiceProvider是默认的Ioc容器。

using Microsoft.Extensions.DependencyInjection;

public class Program
{
    public static void Main(string[] args)
    {
        var serviceProvider = new ServiceCollection()
            .AddScoped()
            .AddTransient
   ()
            .BuildServiceProvider();

        var foo = serviceProvider.GetService
    ();
        foo.DoSomething();
    }
}

public interface IFoo
{
    void DoSomething();
}

public class Foo : IFoo
{
    private readonly IBar _bar;

    public Foo(IBar bar)
    {
        _bar = bar;
    }

    public void DoSomething()
    {
        Console.WriteLine("Foo is doing something");
        _bar.DoSomethingElse();
    }
}

public interface IBar
{
    void DoSomethingElse();
}

public class Bar : IBar
{
    public void DoSomethingElse()
    {
        Console.WriteLine("Bar is doing something else");
    }
}

    
   
  

六、ASP.NET Core中的依赖注入

ASP.NET Core内置的依赖注入功能用来处理不同类之间的依赖项关系,并对所有服务的生命周期进行管理。

以下是ASP.NET Core项目中使用DI的示例:

services.AddScoped<IFooService, FooService>();

上面的代码片段将服务(IFooService)和它的实例(FooService)注册到容器中,这个服务在需要的地方都可以被使用。

七、.NET Core中的生命周期

.NET Core中有三种生命周期:

1、Singleton:单例模式,创建一个对象实例并将其重用。

2、Scoped:创建一个对象实例并将其重用,但在每个HTTP请求处理期间都是唯一的。

3、Transient:在每次请求时都生成一个新的对象实例。

以下代码示例说明了一些不同的生命周期:

services.AddSingleton<IFooService, FooService>();
services.AddScoped<IBarService, BarService>();
services.AddTransient<IBazService, BazService>();

八、小结

依赖注入和控制反转是设计良好的面向对象程序设计的重要工具。.NET Core中的依赖注入提供了一种易于使用、强大而灵活的依赖注入框架。无论是使用内部容器还是外部容器,使用依赖注入将提高您的代码的可测性和扩展性。