簡體   English   中英

如何在ASP.NET Core應用程序中將記錄器傳遞到服務器端的SignalR集線器

[英]How to pass logger into SignalR hub on server side in ASP.NET Core application

我有帶有React客戶端的ASP.NET Core應用程序。 我在服務器和客戶端之間有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));
        }

我可以像其他服務一樣將記錄器從Startup.cs傳遞到ChatHub嗎?

我不確定為什么要在Startup.cs ChatHub記錄器實例傳遞給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, ...);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM