具有多个 ILoggerProvider 实例的 DI 设置



我想添加多个 ILoggerProvider 实例。ILoggerProvider 创建相同的记录器,但具有不同的值

// The constructor for the IloggerProvider looks something like below:
public MyLoggerProvider(IInterface1 val1, IInterface2 val2)
{
// Do Something here
} 
// In my DI setup I want to add multiple instances of the provider like below:
public SetupLoggerProviders(IServiceCollection serviceCollection)
{
var myloggerProvider1 = new MyLoggerProvider(val11, val12);
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider>(myloggerProvider1));

var myloggerProvider2 = new MyLoggerProvider(val21, val22);
serviceCollection.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider>(myloggerProvider2));
}

但这似乎是一个糟糕的解决方案,因为我正在更新对象。我怎样才能做得更好?

你应该使用:

  • AddSingleton()而不是TryAddEnumerable(),因为TryAddEnumerable()只会保留其中一个对象。
  • 工厂λ。这样,记录器提供程序仅在需要时实例化,而不是在SetupLoggerProviders()内部。

最小工作解决方案:

using System;
using Microsoft.Extensions.DependencyInjection;
static class Program
{
static int val11 = 11, val12 = 12, val21 = 21, val22 = 22;
static void Main()
{
IServiceCollection serviceCollection = new ServiceCollection();
SetupLoggerProviders(serviceCollection);
foreach (var loggerProvider in serviceCollection.BuildServiceProvider().GetRequiredService<IEnumerable<ILoggerProvider>>())
{
Console.WriteLine(loggerProvider);
}
}
static void SetupLoggerProviders(IServiceCollection serviceCollection)
{
serviceCollection.AddSingleton<ILoggerProvider>(_ => new MyLoggerProvider(val11, val12));
serviceCollection.AddSingleton<ILoggerProvider>(_ => new MyLoggerProvider(val21, val22));
}
}
interface ILoggerProvider { }
class MyLoggerProvider : ILoggerProvider
{
int val1, val2;
public MyLoggerProvider(int val1, int val2)
{
this.val1 = val1;
this.val2 = val2;
}
public override string ToString() => $"MyLoggerProvider({val1}, {val2})";
}

输出:

MyLoggerProvider(11, 12)
MyLoggerProvider(21, 22)

最新更新