如何在 ASP.NET Core 中为同一接口配置不同的实现

前言

通常,我们使用依赖注入时,一个接口仅对应一种实现,使用时可以直接得到实现类的实例,类似这样:

services.AddScoped<IServiceA,ServiceA>();

public WeatherForecastController(IServiceA service) { }

但是,有时可能需要在同一ASP.NET Core 应用程序中使用同一接口的不同实现。

下面是不同需求下对应的解决方案。

为不同的类型使用不同实现

例如仓储接口IRepository<>,默认使用EF core访问关系型数据库,而对于特定实体(例如订单Order)使用MONGODB存储。

可以首先注册默认实现,再针对特定实体注册指定实现:

services.AddScoped(typeof(IRepository<>), typeof(EFCoreRepository<>));
services.AddScoped(typeof(IRepository<Order>), typeof(MongoRepository<Order>));

106df9f770b719f8de1978d6a1d45dd5.png

在不同的Controller中使用不同实现

例如订单仓储接口IRepository,默认使用MONGODB存储,而在报表服务ReportController中访问ES。

可以针对构造函数注册指定参数:

services.AddScoped<ESRepository<Order>>();
services.AddScoped(x => new ReportController(x.GetRequiredService<ESRepository<Order>>()));

302dd6cd7ca6819a93927e928253ecd3.png

注意:以上方式需要使用命令将Controller添加为服务才能使用:

services.AddControllers().AddControllersAsServices();

结论

关于如何注入同一接口的不同实现,你有什么不同需求或者实现方案,欢迎在公众号首页留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值