.NET Core 依赖注入

在.NET Core中,依赖注入(Dependency Injection,简称DI)是框架的一个重要特性,可以帮助我们解耦代码、管理对象生命周期以及提高可测试性等.一下是.NET Core中依赖注入的一些基本概念和用法:

  1、服务(Service):在DI中,服务即一个对象或者类型。用于完成特定的功能.例如,数据库访问、日志记录等都可以看作一个服务

  2、容器(Container):DI容器用于管理服务的注册和解析.在NET Core中。框架提供了一个内置的DI容器,可以扩展方法services.AddXXX()来注册服务。

  3、生命周期(Lifetime):在DI中,生命周期用于控制服务示例的创建和销毁.例如,一个服务可以是Singleton单例的,即全局仅创建一个实例;也可以是Scoped作用域的,即在同一请求范围内创建一个实例;还可以是Trasient瞬态的,即每次请求都创建一个新的实例

  4、依赖注入(Dependency Injection):依赖注入是指将一个对象所依赖的其他对象通过构造函数、属性或方法等方式,由容器自动注入给对象.在.NET Core中,主要使用构造函数注入的方式。

下面是一个.NET Core中使用依赖注入的示例:

  public interface IMyService

  {

    void DoSomething();

  }

  public class MyService:IMyService

  {

    public void DoSomething()

    {

      Console.WriteLine(“Do something…”);

    } 

  }

  public class MyClass

  {

    private readonly IMyService _myService;

    public MyClass(IMyService myService)

    {

      _myService=myService;

    }

    public void eat()

    {

      _myService.DoSomething)’

    }

  }

//如果是.NET Core:在Startup的ConfigureServices方法中注册服务和依赖注入

  service.AddTransient<IMyService,MyService>();

//如果是.NET6:在Program中注册服务和依赖注入

  builder.Services.AddTransient<IMyService,MyService>();

//在需要使用服务的类中。通过构造函数注入方式获取服务

public class MyController:Controller

{

  private readonly IMyService _myService;

  public MyController(IMyService myService)

  {

    _myService=myService;

  }

  public IActionResult Index()

  {

    _myService.DoSomething();

    return View();

  }

}

在以上示例中,IMyService是一个服务接口,MyService的类。在Startup的ConfigureServices方法中(在program中),将服务注册到容器中;在MyClass的构造函数中,使用构造函数注入的方式获取服务;在MyController中,同样使用构造函数注入的方式获取服务。

扩展:

  以ASP.NET Core为例,Microsoft.Extensions.DependencyInjection(官方提供的DI容器)中默认的生命周期为Scoped。这意味着在同一次请求中,每次注入相同的服务都会返回同一实例。而在不同的请求中,会创建新的实例。

  具体的生命周期应该根据应用程序的需求和实际情况进行选择。在依赖注入数据库的场景中,通常使用Singleton或者Scoped生命周期,以保证数据库连接的单例或在同意请求范围内的重用性。同时,需要注意在使用Singleton生命周期时,应该实现线程含权,避免因多线程环境下的并发访问而导致的问题。

随堂笔记,侵权请联系作者删除!