首页 > 解决方案 > ASP.NET Core 3 - 当工厂方法所需的依赖项可用时,是否可以在 Configure 方法中添加 SignalR 服务?

问题描述

我正在学习 ASP.NET 核心并努力尝试在我AddJsonProtocol的方法中使用的工厂方法中注入一些所需的 ILogger 实例作为参数AddSignalR。请参阅下面的代码。

JsonConvertersFactory工厂方法在 signalR 中创建用于序列化/反序列化的 JsonConverters 。.AddJsonProtocol添加 SignalR 服务时,它在匿名方法中使用。

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddServerSideBlazor();

    services.AddHostedService<MqttKafkaBridge>();
    services.AddHostedService<ConsumerService>();
    services.AddLogging();

    // how can I retrieve ILogger<MotionDetection>, ILogger<MotionInfo>, ILogger<JsonVisitor>?
    services.AddSignalR(o => o.EnableDetailedErrors = true)
      .AddJsonProtocol(options =>
        {
          options.PayloadSerializerOptions = JsonConvertersFactory.CreateDefaultJsonConverters(LoggerMotionDetection, LoggerMotionInfo, LoggerJsonVisitor);
        });

    services.AddCustomConfiguration(services);
}

我可以构建一个临时服务提供者并添加记录器依赖项,以便可以配置 SignalR Json 协议。但是我不确定这是否被认为是反模式......

var sp = services.BuildServiceProvider();
var loggerMD = sp.GetService<ILogger<MotionDetection>>();
var loggerMI = sp.GetService<ILogger<MotionInfo>>();
var loggerJV = sp.GetService<ILogger<JsonVisitor>>();

当我使用时,BuildServiceProvider我收到以下警告消息:

Startup.cs(53,22): warning ASP0000: Calling 'BuildServiceProvider' from application code results in an additional copy of singleton services being created. Consider alternatives such as dependency injecting services as parameters to 'Configure'.

是否可以在Configure方法中添加服务,即在 ILogger 实例可以解析时在配置中添加 SignalR 服务?

或者

是否可以在 Configure 方法中注入 SignalRService 并更新它的 Json 协议配置?

更新

尝试注入 ISignalRServerBuilderConfigure但收到一个异常,即在容器注册表 (Autofac) 中找不到 ISignalRServerBuilder 实例。

有任何想法吗?

 public void Configure(IApplicationBuilder app, ISignalRServerBuilder builder, IWebHostEnvironment env)
        {
            // this tries to build the options from the service container but 
            // the builder is null
            builder.AddJsonProtocol(op =>
            {
                var lMD = app.ApplicationServices.GetService<ILogger<MotionDetectionConverter>>();
                var lMI = app.ApplicationServices.GetService<ILogger<MotionInfoConverter>>();
                var lJV = app.ApplicationServices.GetService<ILogger<JsonVisitor>>();

                op.PayloadSerializerOptions = JsonConvertersFactory.CreateDefaultJsonConverters(lMD, lMI, lJV);
            });

            ...
        }

标签: asp.net-core

解决方案


推荐阅读