ILogger и DependencyInjection в ASP.NET Core 2+ - PullRequest
0 голосов
/ 01 сентября 2018

Я заметил, что нет явной ILogger регистрации в ConfigureServices в Startup.cs.

Первый вопрос: как ILogger вводится, например, в. контроллеры.

Второй вопрос: как настроить ILogger для внедрения в промежуточное ПО?

1 Ответ

0 голосов
/ 01 сентября 2018

Ведение журнала добавлено как часть HostBuilder.Build процесса

private void CreateServiceProvider()
{
    var services = new ServiceCollection();
    services.AddSingleton(_hostingEnvironment);
    services.AddSingleton(_hostBuilderContext);
    services.AddSingleton(_appConfiguration);
    services.AddSingleton<IApplicationLifetime, ApplicationLifetime>();
    services.AddSingleton<IHostLifetime, ConsoleLifetime>();
    services.AddSingleton<IHost, Host>();
    services.AddOptions();
    services.AddLogging();//<--HERE

    //...

WebHostBuilder.BuildCommonServices

    private IServiceCollection BuildCommonServices(out AggregateException hostingStartupErrors)
    {

        //... code removed for brevity

        var services = new ServiceCollection();
        services.AddSingleton(_options);
        services.AddSingleton<IHostingEnvironment>(_hostingEnvironment);
        services.AddSingleton<Extensions.Hosting.IHostingEnvironment>(_hostingEnvironment);
        services.AddSingleton(_context);

        var builder = new ConfigurationBuilder()
            .SetBasePath(_hostingEnvironment.ContentRootPath)
            .AddConfiguration(_config);

        _configureAppConfigurationBuilder?.Invoke(_context, builder);

        var configuration = builder.Build();
        services.AddSingleton<IConfiguration>(configuration);
        _context.Configuration = configuration;

        var listener = new DiagnosticListener("Microsoft.AspNetCore");
        services.AddSingleton<DiagnosticListener>(listener);
        services.AddSingleton<DiagnosticSource>(listener);

        services.AddTransient<IApplicationBuilderFactory, ApplicationBuilderFactory>();
        services.AddTransient<IHttpContextFactory, HttpContextFactory>();
        services.AddScoped<IMiddlewareFactory, MiddlewareFactory>();
        services.AddOptions();
        services.AddLogging();

Чтобы вставить ILogger в контроллер, просто включите его в конструктор как зависимость

private readonly ILogger logger;

public MyController(ILogger<MyController> logger) {
    this.logger = logger;
}

//...

и платформа будет вводить его в контроллер при активации.

Ссылка Внедрение зависимостей в контроллеры в ASP.NET Core

То же самое можно сделать для внедрения в Middleware vai, как и в контроллере,

или непосредственно в метод Invoke для зависимостей для каждого запроса

public Task Invoke(HttpContext context, ILogger<MyMiddleware> logger) {
    //...
}

как и любая другая введенная услуга

Ссылка Промежуточное ПО ядра ASP.NET

...