如何在 ASP.NET 核心应用程序中将记录器传递到服务器端的 SignalR hub
How to pass logger into SignalR hub on server side in ASP.NET Core application
我有 ASP.NET 带有 React 客户端的核心应用程序。
我在服务器和客户端之间有 SignalR 消息传递。
我在服务器端有以下代码:
Startup.cs
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("/signalr");
});
}
...
问题:我能否将记录器从 Startup.cs
传递给 ChatHub
,就像我使用其他服务那样:
Startup.cs
private readonly ILogger _log;
public Startup(IHostingEnvironment env, ILogger<Startup> log)
{
_log = log;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(new Converter(_log));
}
Could I pass logger to ChatHub from Startup.cs as I do it with another services like this
我不确定为什么要在 Startup.cs
内将记录器实例传递给 ChatHub
。但据我所知,您总是可以在需要时注入所需的依赖项。您不必在启动期间手动将记录器实例传递到 ChatHub
。通常,这将被视为一种不好的做法。只需 声明一个依赖项并让 DI 容器注入它。
services.AddSingleton(new Converter(_log));
services.AddSingleton<Converter>(); // DI will new it and inject logger for you
并且还要更改您的 ChatHub
构造函数以接受 ILogger<ChatHub>
public class ChatHub : Hub
{
private readonly ILogger<ChatHub> _logger;
public ChatHub(ILogger<ChatHub> logger)
{
this._logger = logger;
}
public async Task SendMessage(string user, string message)
{
this._logger.LogInformation($"send message to client\r\n {user}\t{message}");
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
如果你确实想自定义Converter的初始化,你可以这样设置:
services.AddSingleton<Converter>(sp => {
var logger = sp.GetRequiredService<ILogger<Converter>>();
// add more service or dependencies manually ...
return new Converter(logger, ...);
});
我有 ASP.NET 带有 React 客户端的核心应用程序。 我在服务器和客户端之间有 SignalR 消息传递。
我在服务器端有以下代码:
Startup.cs
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("/signalr");
});
}
...
问题:我能否将记录器从 Startup.cs
传递给 ChatHub
,就像我使用其他服务那样:
Startup.cs
private readonly ILogger _log;
public Startup(IHostingEnvironment env, ILogger<Startup> log)
{
_log = log;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(new Converter(_log));
}
Could I pass logger to ChatHub from Startup.cs as I do it with another services like this
我不确定为什么要在 Startup.cs
内将记录器实例传递给 ChatHub
。但据我所知,您总是可以在需要时注入所需的依赖项。您不必在启动期间手动将记录器实例传递到 ChatHub
。通常,这将被视为一种不好的做法。只需 声明一个依赖项并让 DI 容器注入它。
services.AddSingleton(new Converter(_log));services.AddSingleton<Converter>(); // DI will new it and inject logger for you
并且还要更改您的 ChatHub
构造函数以接受 ILogger<ChatHub>
public class ChatHub : Hub { private readonly ILogger<ChatHub> _logger; public ChatHub(ILogger<ChatHub> logger) { this._logger = logger; } public async Task SendMessage(string user, string message) { this._logger.LogInformation($"send message to client\r\n {user}\t{message}"); await Clients.All.SendAsync("ReceiveMessage", user, message); } }
如果你确实想自定义Converter的初始化,你可以这样设置:
services.AddSingleton<Converter>(sp => {
var logger = sp.GetRequiredService<ILogger<Converter>>();
// add more service or dependencies manually ...
return new Converter(logger, ...);
});