如何在 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 中使用 HttpClientFactory ?
ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...
- 如何在 ASP.Net Core 中使用 Autofac
依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...
- 如何在 ASP.Net Core 中使用 Lamar
ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...
- 如何在 ASP.Net Core 中使用 MediatR
MediatR 是一个 中介者模式 的.NET开源实现, 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖,在 中介者模式 中,一个对象不需要直接和另一个对象进行通讯, ...
- 如何在 ASP.Net Core 中对接 WCF
在 REST API 出现之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的标准协议,虽然现在 REST 大行其道,但在平时开发中总会遇到对接第三 ...
- 如何在 ASP.Net Core 中使用 NCache
虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式. 内存缓存 分布式缓存 Response缓存 Alachisoft 公司提供了一个开源项目 NCache, ...
- 如何在 ASP.Net Core 中使用 Configuration Provider
ASP.NET Core 是一个开源的,跨平台的,精简的模块化框架,可用于构建高性能,可扩展的web应用程序, ASP.NET Core 中的数据配置常用 k-v 的形式存储,值得注意的是,新的数据配 ...
- 如何在 ASP.Net Core 中使用 Serilog
记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...
- 如何在 ASP.NET Core 中使用 URL Rewriting 中间件
URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...
最新文章
- SQL Server 储存过程的output 参数
- 增加ActiveDirectory证书服务器有效期与续订步骤
- 五一商圈之外,红星商圈再塑长沙商圈第二极
- 7.3 编址与存储相关计算
- C++ static的作用
- python退出mainloop_python - Python Turtle mainloop()的用法 - 堆栈内存溢出
- 从 Dagger 到 Hilt,谷歌为何执着于让我们用依赖注入?
- 帝国CMS二次元COS漫展信息分享网站模板
- postgresql 的 .pgpass密码文件的使用
- 智能会议系统(6)---高效视频会议系统
- Git:tag标签的使用
- 三酷猫学python_python学习第6期
- 正确解决:关于Lattic Diamond软件注册不成功(license问题)
- 超像素块提取 matlab,GitHub - CielChen/Make3DFeature: 将图像分割成超像素,并提取每个超像素块的Make3D特征...
- 素描构图中的对比与调和
- OpenGL开启Gouraud明暗处理,减少马赫夫效应
- matlab写子函数,matlab主函数子函数怎么写
- 英语写作翻译-形容词(一)
- CVPR 2021 华南理工和微信的Transformer:UP-DETR无监督预训练检测器
- 计算机毕业设计之 少儿编程学习平台的设计与实现
热门文章
- Java学习优秀网站
- 在Leangoo里怎么设置看板周期?
- css改变谷歌浏览器的滚动条样式
- 架构设计:远程调用服务架构设计及zookeeper技术详解(上篇)
- 数据可视化----我在寻找一款类似vfp或是access这样自带可视化风格的数据库或是键盘数据库...
- cisco 双ISP线路接入,链路自动切换方案
- python c 选择_C和Python,小白应该选择学习哪门语言?
- Java笔记:包装类、toString()方法、单例类、比较(==和equals方法)
- QQ,MSN,Skype在线客服代码
- wikioi 1034 家 实时动态的网络流量(费用流)