我想添加多个 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)