【问题标题】:how to run specific service when dotnet core console startsdotnet核心控制台启动时如何运行特定服务
【发布时间】:2021-01-22 17:38:28
【问题描述】:

在 .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 实例)

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

【问题讨论】:

    标签: .net-core dependency-injection console-application serilog mediatr


    【解决方案1】:

    您可以使用此代码:

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

    但是注入IMediator 的实例并不是一个好主意,它的生命周期(我猜,因为通常它是有范围的)比你的MyService 短。

    一些信息:

    不要依赖单例服务中的瞬态或范围服务。因为当单例服务注入瞬态服务时,瞬态服务会变成单例实例,如果瞬态服务不是为支持这种情况而设计的,则可能会导致问题。在这种情况下,ASP.NET Core 的默认 DI 容器已经抛出异常。

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 2020-11-07
      • 2021-12-01
      • 2017-12-07
      • 2015-05-11
      • 1970-01-01
      • 2021-09-02
      • 2013-02-06
      • 1970-01-01
      相关资源
      最近更新 更多