c# - 如何使用采用相同接口的两个实现的类构造函数来解决依赖注入
问题描述
我只知道 IoC 的基础知识。为了简单起见(嗯),我想留在Microsoft.Extensions.DependencyInjection
.
IProcessor
接口(我IData
没有详细说明,由类实现Excel
)SQLServer
:
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();
}
}
问题是两者都excel
被slqServer
实例化为SQLServer
(即最后IData
注册的单例)。如何通过依赖注入解决此实例化?
我已经找到了一种通过以下方式实例化特定类的方法,但我不认为它直接(和隐式)适用于类构造函数......
var excel = _serviceProvider.GetServices<IData>()
.First(o => o.GetType() == typeof(Excel));
感谢您的任何见解。
解决方案
您可以注册一个代表:
var service = new ServiceCollection()
.AddSingleton<Excel>()
.AddSingleton<SQLServer>()
.AddSingleton<IProcessor>(provider =>
new Processor(
provider.GetRequiredService<Excel>(),
provider.GetRequiredService<SQLServer>())
.AddSingleton<Program>();
推荐阅读
- php - 如何使用 PHP 和 mysql 使用任务调度程序自动发送电子邮件?
- firebase - 在使用颤振验证 google 登录时遇到问题
- node.js - 找不到本地 grunt 文件
- regex - Powershell 特定字符与函数不匹配
- xml - 用powershell替换cordova的config.xml中的值
- php - 防止 laravel 在 URL 中接受 index.php
- java - 如何自动从 IntelliJ 添加测试方法的注释部分?
- excel - 单独计算每一天
- javascript - 使用 Postgres 11 通过双引号来防止 SQL 注入是否有效?
- java - JavaFX条形图的CSS线性渐变