DI get service by key 通过key来获取不同的service

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

最近更新的
...