在 Startup 类中获取依赖于 DI 的类的实例
Posted
技术标签:
【中文标题】在 Startup 类中获取依赖于 DI 的类的实例【英文标题】:Get instance of class that relies on DI in Startup class 【发布时间】: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。
【问题讨论】:
【参考方案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<RunAfterStartup>
以上是关于在 Startup 类中获取依赖于 DI 的类的实例的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core 1.0 的 DI 中的 Startup 类中添加 IHttpContextAccessor?