Asp.Net Core依赖注入用法


依赖注入概念

.NET Core 的依赖注入(Dependency Injection)是一种管理对象生命周期并解耦组件之间依赖关系的机制。使用依赖注入,我们可以将一个类所依赖的其他类的实例交给外部容器来创建并注入进来,从而降低组件之间的耦合度。


IOC生命周期

生命周期总共分为三种:

AddScoped :一个上下文一个对象 ,一般用于业务类,仓储等

Transient :每次都创建新对象 和 AddScoped 类似地方很多,适合独立性没有同一个上下文共享,非线程安全对象

 AddSingleton:单例只有一个对象 ,一般用到线程安全对象


简单示例

首先,在 Startup.cs 文件中配置依赖注入服务:

//不同生命周期用法都一个只是换个名字
public void ConfigureServices(IServiceCollection services)
{
    //Transient(每次都创建新对象)
    services.AddTransient<IMyService, MyService>();
}

这里注册了一个名为 IMyService 的服务接口和它的实现类 MyService,并使用 Transient 生命周期,表示每次调用时都会创建新的实例。

接着,在需要使用 IMyService 的类中,可以通过构造函数将其注入进来:

public class HomeController : Controller
{
    private readonly IMyService _myService;
    public HomeController(IMyService myService)
    {
        _myService = myService;
    }
    public IActionResult Index()
    {
        var data = _myService.GetData();
        return View(data);
    }
}

这里的 HomeController 类需要使用 IMyService 的实例,在构造函数中将其注入。在 Index 方法中,可以使用 _myService 实例调用其方法获取数据。

通过以上步骤,我们就可以在代码中使用依赖注入来管理组件之间的依赖关系了。


IOC批量注入

如果您想要动态地循环注册服务而不是一个一个地注册,可以使用反射来扫描程序集中的类型并进行注册。

以下是一个示例,它使用反射来查找程序集中实现了特定接口的所有类型,并将它们注册到依赖注入容器中:

var assembly = Assembly.GetExecutingAssembly(); // 如果不是当前程序集可以改成指定程序集 
// 获取所有实现了 IMyService 接口的类型
var serviceTypes = assembly.GetTypes()
    .Where(type => typeof(IMyService).IsAssignableFrom(type) && !type.IsInterface);
// 循环注册所有类型
foreach (var serviceType in serviceTypes)
{
    services.AddTransient(serviceType);
}

这个示例使用 Assembly.GetTypes() 方法获取程序集中的所有类型,并使用 LINQ 查询来筛选出所有实现了 IMyService 接口的非接口类型。然后,它使用 services.AddTransient() 方法将这些类型注册到依赖注入容器中。

使用这种方法,您可以动态地扫描程序集并注册所有实现了特定接口的类型,而不必手动一个一个地注册它们。


果糖网