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.Logging
( source を参照)は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>
を注入します。
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.
コンソールアプリのメインメソッド
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>>();