.NET Core 依赖注入 - 强制立即激活

Jep*_*ppe 4 .net c# dependency-injection asp.net-core-mvc

我的理解是,在调用构造函数之一之前,不会激活注入的类(例如我的 MVC 项目中的控制器)。但是,是否可以立即强制激活 Singleton,这样我就不必等待调用控制器?我想我可以这样做:

services.AddSingleton(new MySingleton());
Run Code Online (Sandbox Code Playgroud)

但是如果 MySingleton 在其构造函数中使用 DI 呢?有没有办法调用构造函数?我应该更改构造函数以将 IServiceProvider 作为参数并手动提取依赖项吗?:

_myDependency = serviceProvider.GetService<MyDependency>();
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 6

假设我们有一个这样实现的类。

public class MySingleton {
    private readonly IMyDependency dependency;
    MySingleton(IMyDependency dependency) {
        this.dependency = dependency;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我正确理解你的问题,你正在寻找这样的东西。

services.AddSingleton<IMyDependency, MyDependency>();
services.AddSingleton<MySingleton>(provider => new MySingleton(provider.GetService<IMyDependency>()));
Run Code Online (Sandbox Code Playgroud)

这将创建一个实现工厂,用于在需要时初始化您的单例。它是在手动初始化类型时提供服务提供者的重载。

例如,如果您需要在注册后立即访问您的单身人士。

var serviceProvider = services.BuildServiceProvider();

MySingleton singleton = serviceProvider.GetService<MySingleton>();
Run Code Online (Sandbox Code Playgroud)