如何在 ASP.NET Core 中为同一接口配置不同的实现
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在 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>));
在不同的Controller中使用不同实现
例如订单仓储接口IRepository,默认使用MONGODB存储,而在报表服务ReportController中访问ES。
可以针对构造函数注册指定参数:
services.AddScoped<ESRepository<Order>>();
services.AddScoped(x => new ReportController(x.GetRequiredService<ESRepository<Order>>()));
注意:以上方式需要使用命令将Controller添加为服务才能使用:
services.AddControllers().AddControllersAsServices();
结论
关于如何注入同一接口的不同实现,你有什么不同需求或者实现方案,欢迎在公众号首页留言交流!
以上是关于如何在 ASP.NET Core 中为同一接口配置不同的实现的主要内容,如果未能解决你的问题,请参考以下文章
如何在 asp.net core 3.1 中为每种类型的请求启用 Cors
如何在 ASP.NET Core 中为 gRPC 服务添加全局异常处理 ?
如何在Asp.net Core的登录过程中为“记住我”设置单个cookie超时?