Как передать регистратор в концентратор SignalR на стороне сервера в приложении ASP.NET Core - PullRequest
0 голосов
/ 20 июня 2019

У меня есть приложение ASP.NET Core с клиентом React. У меня есть обмен сообщениями между сервером и клиентом.

У меня есть следующий код на стороне сервера:

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 Ответ

1 голос
/ 21 июня 2019

Могу ли я передать регистратор в ChatHub из Startup.cs, как я делаю это с другими сервисами, подобными этому

Я не уверен, почему вы хотите передать экземпляр регистратора в ChatHub в Startup.cs. Но, насколько я знаю, вы всегда можете ввести необходимые зависимости, когда вам нужно. Вам не нужно вручную передавать экземпляр регистратора в ChatHub во время запуска. Как правило, это будет считаться плохой практикой. Просто объявите зависимость и дайте контейнеру DI внедрить ее .

<strike>services.AddSingleton(new Converter(_log));</strike>
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(<b>ILogger<ChatHub> logger</b>)
    {
        <b>this._logger = logger;</b>
    }

    public async Task SendMessage(string user, string message)
    {
        <b>this._logger.LogInformation($"send message to client\r\n {user}\t{message}");</b>
        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, ...);
});
...