首页 > 解决方案 > 如何使用采用相同接口的两个实现的类构造函数来解决依赖注入

问题描述

我只知道 IoC 的基础知识。为了简单起见(嗯),我想留在Microsoft.Extensions.DependencyInjection.

IProcessor接口(我IData没有详细说明,由类实现ExcelSQLServer

public interface IProcessor
{
    List<FielModel> ReadFieldsFromExcel();
    List<FieldModel> ReadFieldsFromSQLServer();
}

Processor实施:

public class Processor : IProcessor
{
    private readonly IData _excel;
    private readonly IData _sqlServer;
    
    public Processor(IData excel, IData sqlServer)
    {
        _excel = excel;
        _sqlServer = sqlServer;
    }
    
    public List<FielModel> ReadFieldsFromExcel();
    {
        // ..
    }
    
    public List<FieldModel> ReadFieldsFromSQLServer();
    {
        // ..
    }
}

主要Program用DI。

class Program
{
    private static ServiceProvider _serviceProvider;
    
    static void Main(string[] args)
    {
        RegisterServices();
        
        var processor = _serviceProvider.GetService<IProcessor>();
        
        // ..
    }
    
    private static void RegisterServices()
    {
        // Setups dependency injection
        var service = new ServiceCollection()
            .AddSingleton<IProcessor, Processor>()
            .AddSingleton<IData, Excel>()
            .AddSingleton<IData, SQLServer>()
            .AddSingleton<Program>();
            
        _serviceProvider = service.BuildServiceProvider();
    }
}

问题是两者都excelslqServer实例化为SQLServer(即最后IData注册的单例)。如何通过依赖注入解决此实例化?

我已经找到了一种通过以下方式实例化特定类的方法,但我不认为它直接(和隐式)适用于类构造函数......

var excel = _serviceProvider.GetServices<IData>()
                            .First(o => o.GetType() == typeof(Excel));

感谢您的任何见解。

标签: c#dependency-injectioninterface

解决方案


您可以注册一个代表:

var service = new ServiceCollection()
    .AddSingleton<Excel>()
    .AddSingleton<SQLServer>()
    .AddSingleton<IProcessor>(provider =>
        new Processor(
            provider.GetRequiredService<Excel>(),
            provider.GetRequiredService<SQLServer>())
    .AddSingleton<Program>();
        

推荐阅读