【问题标题】:Get instance of class that relies on DI in Startup class在 Startup 类中获取依赖于 DI 的类的实例
【发布时间】:2020-04-26 22:25:24
【问题描述】:

我正在运行 .NET Core 2.2 应用程序,并且我想在 Startup.cs 中进行初始设置后立即运行一些代码。该类依赖于注册类型,我真的不明白我应该如何创建一个已经注入依赖项的实例。假设我有以下类,我想在设置完成后立即运行。

public class RunAfterStartup
{
    private readonly IInjectedService _injectedService;

    public RunAfterStartup(IInjectedService injectedService)
    {
        _injectedService = injectedService;
    }

    public void Foo()
    {
        _injectedService.Bar();
    }
}

有没有办法可以在启动时运行RunAfterStartup().Foo()

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton(typeof(IInjectedService), typeof(InjectedService));
    ...
}

public void Configure(IApplicationBuilder app)
{
    app.UseMvc();

    // I assume this has to go here, but could be anywhere
    var runAfterStartup = MagicallyGetInstance();
    runAfterStartup.Foo();
}

我知道在 .NET Framework(不确定 Core)中,您可以使用 SimpleInjector 执行此操作,方法是执行 container.GetInstance<RunAfterStartup>().Foo() 之类的操作,但我不确定这在 .NET Core 中如何工作,我只想使用内置DI。

【问题讨论】:

    标签: c# .net-core dependency-injection asp.net-core-2.2


    【解决方案1】:

    首先在ConfigureServices 方法中将RunAfterStartup 添加到您的服务中:

    services.AddSingleton<RunAfterStartup>();
    

    现在您可以将此类注入Configure 方法:

    public void Configure(IApplicationBuilder app, RunAfterStartup runAfterStartup)
    {
        app.UseMvc();
    
        runAfterStartup.Foo();
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过传递的参数访问依赖注入容器:

      public void Configure(IApplicationBuilder app)
      {
          app.UseMvc();
      
          // I assume this has to go here, but could be anywhere
          var runAfterStartup = app.ApplicationServices.GetService<IInjectedService>();
          runAfterStartup.Foo();
      }
      

      【讨论】:

      • 我认为IInjectedService应该被注入RunAfterStartup,但我想这并不重要。可能值得指出的是,这基本上是服务定位器模式,通常是一种反模式,特别是当框架已经支持为您进行适当的注入时。
      • 这不是给我一个IInjectedService 的实例吗?我需要 RunAfterStartup 中的那个实例。
      • 哦,是的,抱歉,复制/粘贴错误。只需注册您的RunAfterStartup 课程,然后使用GetService&lt;RunAfterStartup&gt;
      猜你喜欢
      • 2013-06-30
      • 2021-12-10
      • 2023-03-27
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多