.NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(下)
05 | 依赖注入:良好架构的起点
注册完毕之后,想替换某些组件的某些部分时,可以使用 Replace 和 RemoveAll
services.AddSingleton<IOrderService>(new OrderService1());
services.Replace(ServiceDescriptor.Singleton<IOrderService, OrderService2>());// 替换掉注册的第一个实现
启动程序,输出如下:
获取到服务实例:DependencyInjectionDemo.Services.OrderService2:25560520
从结果看出,注册的 OrderService1 被替换为 OrderService2
下面介绍 RemoveAll
services.AddSingleton<IOrderService>(new OrderService1());
services.AddSingleton<IOrderService, OrderService2>();
services.RemoveAll<IOrderService>();// 移除所有 IOrderService 的注册
这种情况下程序会报错,因为所有 IOrderService 的注册被移除
Unable to resolve service for type 'DependencyInjectionDemo.Services.IOrderService'
下面介绍如何注册泛型模板
当需要注册一组泛型实现的时候
实际上注册的时候并不知道泛型类的具体类型入参
依赖注入框架为我们提供了泛型模板的注册方式
通过一行代码来注册所有此泛型的具体实现
定义一个泛型接口
namespace DependencyInjectionDemo.Services
{
public interface IGenericService<T>
{
}
public class GenericService<T> : IGenericService<T>
{
public T Data { get; private set; }
public GenericService(T data)
{
this.Data = data;
}
}
}
泛型模板注册方法
services.AddSingleton(typeof(IGenericService<>), typeof(GenericService<>));
它的生命周期与之前的注册方式是一致的
不过它无法通过泛型 API 注册
需要注册两个 service 的 type
第一个入参是服务的类型
第二个入参是服务实现的类型
接下来,看看如何在 controller 中使用
// 在构造函数中添加两个入参,IOrderService 和 IGenericService
// 通过断点调试查看 genericService 的类型可得知,泛型的具体实现可以用容器里面的任意类型来替代
public WeatherForecastController(ILogger<WeatherForecastController> logger, IOrderService orderService, IGenericService<IOrderService> genericService)
{
_orderService = orderService;
_logger = logger;
}
在 controller 中有两种依赖注入的实例的获取方式:
- 通过 controller 构造函数注入
- 通过 [FromServices] 注入
当定义一个 controller 的时候
它的服务是大部分接口都需要使用的情况下
推荐的做法是用构造函数注入的方式
如果这个服务仅仅在某一个接口使用的情况下
推荐使用 [FromServices] 注入
GitHub源码链接:
https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/DependencyInjectionDemo



本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
.NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(下)的更多相关文章
- [ASP.NET Core开发实战]基础篇02 依赖注入
ASP.NET Core的底层机制之一是依赖注入(DI)设计模式,因此要好好掌握依赖注入的用法. 什么是依赖注入 我们看一下下面的例子: public class MyDependency { pub ...
- 2月送书福利:ASP.NET Core开发实战
大家都知道我有一个公众号“恰童鞋骚年”,在公众号2020年第一天发布的推文<2020年,请让我重新介绍我自己>中,我曾说到我会在2020年中每个月为所有关注“恰童鞋骚年”公众号的童鞋们送一 ...
- 把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog
Net Core 大量使用依赖注入(Dependency Inject), 打个比方,我们常用的日志组件有Log4Net,NLog等等. 如果我们要随时替换日志组件,那么代码中就不能直接引用某个组件的 ...
- .Net Core 最简洁的约定式依赖注入
.Net Core 最简洁的约定式依赖注入 github:https://github.com/280780363/guc/tree/master/src/Guc.Kernel/Dependency ...
- [ASP.NET Core开发实战]开篇词
前言 本系列课程文章主要是学习官方文档,再输出自己学习心得,希望对你有所帮助. 课程大纲 本系列课程主要分为三个部分:基础篇.实战篇和部署篇. 希望通过本系列课程,能让大家初步掌握使用ASP.NET ...
- [ASP.NET Core开发实战]基础篇03 中间件
什么是中间件 中间件是一种装配到应用管道,以处理请求和响应的组件.每个中间件: 选择是否将请求传递到管道中的下一个中间件. 可在管道中的下一个中间件前后执行. ASP.NET Core请求管道包含一系 ...
- ASP.NET Core 在 JSON 文件中配置依赖注入
前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等 ...
- Spring实战 (第3版)——依赖注入
首先弄明白几个概念: 1.什么是POJO 2.JavaBean规范 3.EJB(Enterprise JavaBean) 体会Spring如何简化Java开发. 创建应用对象(组件)之间协作关系的行为 ...
- TypeC一个微软开发的超简单.NET依赖注入/IoC容器
控制反转(IoC,Inversion of Control)是由Martin Fowler总结出来的一种设计模式,用来减少代码间的耦合.一般而言,控制反转分为依赖注入(Dependency Injec ...
- 基于.NET平台的分层架构实战(六)——依赖注入机制及IoC的设计与实现[转]
原文:http://www.cnblogs.com/leoo2sk/archive/2008/06/19/1225223.html 我们设计的分层架构,层与层之间应该是松散耦合的.因为是单向单一调用, ...
随机推荐
- vue+elementUI+WebSocket接收后台实时消息推送
vue+elementUI+WebSocket接收后台实时消息推送 https://blog.csdn.net/weixin_40888956/article/details/105971432?ut ...
- java进阶(21)--集合基础
一.基本概念 1.数组其实是一个集合,二集合是一个容器 2.集合不能直接存储基本数据类型,也不能存java对象,存储的是引用数据类型 list.add(100); //自动装箱Integer 3.ja ...
- Https 原理与工作流程及证书链校验
本文为博主原创,未经允许不得转载: 目录 HTTP传输三大风险 安全通信原则 HTTPS定义 TLS/SSL 协议及加密算法 HTTPS工作流程 HTTPS协议和HTTP协议的区别 CA机构 证书链校 ...
- CDC设计实例-02
CDC设计实例 加速器 假设要处理一项业务比如图像处理,有两种方向,第一种选择一些通用的处理器CPU\GPU\DSP等通用的处理器,第二种是将算法映射成IP,直接使用IP进行处理图像处理等专门的业务就 ...
- 幻兽帕鲁 Palworld 私有服务器一键部署教程
<幻兽帕鲁>(日语:パルワールド,英语:Palworld) 是由日本开发商 Pocket Pair 推出的一款动作冒险生存游戏.游戏设定在一个由类似动物的生物 "帕鲁" ...
- [转帖]JMeter 接口测试快速入门
https://my.oschina.net/choerodon/blog/5289725 JMeter简介 JMeter 的特性: 对于多种协议的功能测试和性能测试 Web - HTTP, HT ...
- [转帖]linux删除文本文件空白行
linux删除文本文件空白行https://www.zhihu.com/people/chen-kai-84-54-75 sed命令 在Linux中,可以使用sed命令批量删除文本中的空白行.以下是一 ...
- [转帖]淫技巧 | 如何查看已连接的wifi密码
https://blog.csdn.net/DynmicResource/article/details/120134984?spm=1001.2014.3001.5502 主题使用方法:https: ...
- [转帖]linux性能优化-CPU利用率
参数说明 /proc/stat提供系统的CPU和任务统计信息. user(us): 用户态CPU时间,不包括下面的nice时间,但包括了guest时间. nice(ni): 代表低优先级用户态CPU时 ...
- [转帖]将nginx.conf文件的内容拆分成多个
nginx的如果有多个server模块都配置在同一个nginx.conf文件会显得比较臃肿,后续维护起来也会比较困难,所以可以将内容写入到多个配置文件中然后在nginx.conf文件中通过includ ...