web-dev-qa-db-ja.com

SerilogおよびAutoFacを使用してコンソールアプリケーションでMicrosoft.Extensions.Logging <T>を取得する方法

ASP.NET Coreアプリケーションには、ctorに含まれる共通のBLクラスがあります。

Microsoft.Extensions.Logging.ILogger<Foo>

ASP.NET Coreでは、ASP.NETの内部インフラストラクチャが、LoggerFactoryを介したILoggerの取得を処理します。

ここで、これらのBLクラスをコンソールアプリケーション(非同期ジョブ用)で再利用したいと思いますが、 AutoFac とSerilogを設定して、LoggerFactoryが存在しない環境にMicrosoft.Extensions.Logging.ILogger<T>を挿入する方法を教えてください。

Microsoft.Extensions.Loggingsource を参照)はASP.NET Coreの一部ではなく、ASP.NET Coreとは独立して実行できます。 ILoggerFactoryおよびILogger<>インターフェースを登録するだけです。

ILoggerFactory使用されるLogger<T>実際のロガーをインスタンス化します。

コンソールアプリケーションでLogging拡張機能を使用する場合、IServiceCollection拡張メソッド を使用して、サポートするすべてのパッケージを登録できるため、IServiceCollectionを使用することをお勧めします。このパターン。

var services = new ServiceCollection();
services.AddLogging();

// Initialize Autofac
var builder = new ContainerBuilder();
// Use the Populate method to register services which were registered
// to IServiceCollection
builder.Populate(services);

// Build the final container
IContainer container = builder.Build();

これは、Microsoft.Extensions.DependencyInjection統合サポートのあるライブラリに登録する必要があるクラスを詳細に考える必要がないため、推奨されるアプローチです。

もちろん、手動で登録することもできますが、Microsoft.Extensions.Loggingライブラリに変更が発生すると(新しい依存関係が追加されます)、それを取得できず、最初に把握するか、Dig ソースにcode エラーを検索します。

builder.RegisterType<LoggerFactory>()
    .As<ILoggerFactory>()
    .SingleInstance();
builder.RegisterGeneric(typeof(Logger<>))
    .As(typeof(ILogger<>))
    .SingleInstance();

あとは、コンテナが構築された後、またはアプリケーションが起動する前に、ロガータイプを登録するだけです。

var loggerFactory = container.Resolve<ILoggerFactory>();
loggerFactory.AddConsole()
    .AddSerilog();

そしてあなたのサービスではいつものようにILogger<MyService>を注入します。

27
Tseng

Autofacに手動で直接irを登録する場合は、少し異なるアプローチをお勧めします。

private static void ConfigureLogging(ILoggingBuilder log)
{
    log.ClearProviders();
    log.SetMinimumLevel(LogLevel.Error);
    log.AddConsole();
}

private static void ConfigureContainer(ContainerBuilder builder)
{
    builder.Register(handler => LoggerFactory.Create(ConfigureLogging))
        .As<ILoggerFactory>()
        .SingleInstance()
        .AutoActivate();

    builder.RegisterGeneric(typeof(Logger<>))
        .As(typeof(ILogger<>))
        .SingleInstance();
    // other registrations
}

そして、これはあなたのメインのスタートアップコードです:

var containerBuilder = new ContainerBuilder();
ConfigureContainer(containerBuilder);

var container = containerBuilder.Build();
var serviceProvider = new AutofacServiceProvider(container);
// you can use either the built container or set the serviceProvider onto the library you are using.
0
Marcos Junior

コンソールアプリのメインメソッド

var builder = new ConfigurationBuilder()
             .SetBasePath(Directory.GetCurrentDirectory())
             .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
             .AddEnvironmentVariables();
        IConfigurationRoot configuration = builder.Build();

        var serviceProvider = new ServiceCollection()
                .AddDbContext<MyDbContext>(optionns => optionns.UseSqlServer(configuration.GetConnectionString("connectionString")))
                .AddSingleton(typeof(ILogger<>), typeof(Logger<>))
                .AddLogging() 
                .BuildServiceProvider();

        MyDbContext _context = serviceProvider.GetService<MyDbContext>();
        var _logger = serviceProvider.GetService<ILogger<YourClass>>();
0
Arun Solanki