Autofac是有直接支持这个功能的。但是微软自带的框架是没有这个功能的。
我们必须通过注入 多个具体实现的的方式。并注入一个函数GetLogger。或者一个工厂来实现它。
using Microsoft.Extensions.DependencyInjection;
var sp = ConfigureServices();
var example = sp.GetService<Example>();
example.Test();
Console.ReadLine();
static IServiceProvider ConfigureServices()
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddScoped<MalemaDbLogger>();
serviceCollection.AddScoped<MalemaConsoleLogger>();
// 直接注入一个 Func<string,IMalemaLogger> 的函数
serviceCollection.AddSingleton(sp =>
{
return new Func<string, IMalemaLogger>((string key) =>
{
// 跟据key 返回不同的实现
if (key == "db")
{
return sp.GetRequiredService<MalemaDbLogger>();
}
return sp.GetRequiredService<MalemaConsoleLogger>();
});
});
serviceCollection.AddScoped<Example>();
return serviceCollection.BuildServiceProvider();
}
class Example
{
private readonly Func<string, IMalemaLogger> loggerFunc;
public Example(Func<string, IMalemaLogger> loggerFunc)
{
this.loggerFunc = loggerFunc;
}
public void Test()
{
var dbLogger = this.loggerFunc("db");
dbLogger.Log("from db");
var consoleLogger = this.loggerFunc("");
consoleLogger.Log("from console");
}
}
interface IMalemaLogger
{
void Log(string message);
}
class MalemaConsoleLogger : IMalemaLogger
{
void IMalemaLogger.Log(string message)
{
Console.WriteLine(message);
}
}
class MalemaDbLogger : IMalemaLogger
{
void IMalemaLogger.Log(string message)
{
Console.WriteLine("db::::" + message);
}
}
输出 db::::from db from console