如何在dotnet核心控制台启动时运行特定服务



在.NET Core控制台应用程序中,我想在Program.cs:中执行此操作

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureServices(serviceCollection =>
{
serviceCollection.AddSingleton(new MyService()); // error on this line

});
webBuilder.UseStartup<Startup>();
});

我得到的错误是:

没有给出与所需形式相对应的参数"MyService(ILogger,IMediator("的参数"logger">

当我调用MyService 的构造函数时,我不确定应该如何添加2个必需的参数(serilog Logger和mediat-r实例(

我需要这个,因为当我打开/运行控制台时,必须调用一次服务。。。

您可以使用以下代码:

serviceCollection.AddSingleton(ctx => new MyService(ctx.GetService<ILogger>(), ctx.GetService<IMediator>()));

但注入IMediator的实例并不是一个好主意,因为它的生存期(我想,因为它通常是有作用域的(比MyService短。

一些信息:

  • 在ASP.NET Core中的Singleton中使用作用域依赖项
  • ASP.NET核心依赖项注入最佳实践、提示;技巧

不要依赖于单例服务中的瞬态或作用域服务。因为当单例服务注入瞬态服务时,瞬态服务就变成了单例实例,如果瞬态服务不支持这种场景,这可能会导致问题。在这种情况下,ASP.NET Core的默认DI容器已经抛出异常。

最新更新