asp.net-core - 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);
});
...
}
解决方案
推荐阅读
- gradle - 如何为 Gradle 5.6.2+ 的全局 init.gradle pluginManagement 提供凭据?
- python - python中的平滑直方图
- python - 如何在python中检查路径/文件是否存在?
- r - 如何在 R 中使用长数据进行箱线图
- json - Swift IOS 无法使用 Codable 访问 json 数组数据
- android - windows10无法运行mksdcard.exe SDK工具android v3.5.2
- mysql - 使用另一个表的主键创建一个表,该表由多个列组成
- angular - 使用 RXJS,我可以将一个 observable 或 subject 连接到一个不断变化的源 observable 吗?
- ruby - 如何使用基于域的列表按字母顺序对字符串数组进行排序
- regex - Matlab中的正则表达式仅保留数组的指定项