.NET核心依赖项注入-强制立即激活

egmofgnx  于 2022-11-19  发布在  .NET
关注(0)|答案(3)|浏览(123)

据我所知,注入类直到一个构造函数被调用时才被激活(就像我的MVC项目中的Controller)。然而,是否有可能立即强制激活Singleton,这样我就不必等待控制器被调用了?我想我可以这样做:

services.AddSingleton(new MySingleton());

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

_myDependency = serviceProvider.GetService<MyDependency>();
mzaanser

mzaanser1#

或者,您可以通过在startup.cs内的configure方法中调用服务来激活服务

public void Configure(IApplicationBuilder app)
  {
       app.ApplicationServices.GetService<MySingleton>();
  }
41zrol4v

41zrol4v2#

AddHostedService()将立即示例化服务,但也有一些缺点。

6pp0gazn

6pp0gazn3#

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

public class MySingleton {
    private readonly IMyDependency dependency;
    MySingleton(IMyDependency dependency) {
        this.dependency = dependency;
    }
}

如果我没理解错你的问题,你要找的是这样的东西。

services.AddSingleton<IMyDependency, MyDependency>();
services.AddSingleton<MySingleton>(provider => new MySingleton(provider.GetService<IMyDependency>()));

这将创建一个实现工厂,用于在需要时初始化单元集。它是一个重载,用于在手动初始化类型时提供服务提供程序。
例如,如果您需要在注册后立即访问您的单例。

var serviceProvider = services.BuildServiceProvider();

MySingleton singleton = serviceProvider.GetService<MySingleton>();

相关问题