如何在ASP.NET Core应用程序中将记录器传递到服务器端的SignalR集线器

时间:2019-06-20 15:12:43

标签: c# asp.net-core logging signalr

我有带有React客户端的ASP.NET Core应用程序。 我在服务器和客户端之间有SignalR消息传递。

我在服务器端有以下代码:

Startup.cs

    ...
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseSignalR(routes =>
        {
            routes.MapHub<ChatHub>("/signalr");
        });
    }
    ...

问题:我可以通过其他服务将记录器从 ChatHub 传递到Startup.cs

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));
        }

1 个答案:

答案 0 :(得分:1)

  

我是否可以像使用其他服务一样将记录器从Startup.cs传递到ChatHub

我不确定您为什么要将记录器实例传递到ChatHub中的Startup.cs。但是据我所知,您总是可以在需要时注入所需的依赖项。在启动期间,您不必手动将记录器实例传递到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, ...);
});