.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 我们设计的分层架构,层与层之间应该是松散耦合的.因为是单向单一调用, ...
随机推荐
- echart自定义主题
echart默认以canvas展示,放大会模糊,可以使用svg格式.
- python连接liunx主机:paramiko类基本操作
一.下载paramiko类 pip install paramiko 二.实现过程 # coding utf-8# author:Mr.white import paramiko # 创建SSHCli ...
- Kubernetes 疑难杂症汇总
1. 部署报错:The requested fsGroup is 123, but the volume local-pv-c7ef339e has GID 1000710000. The volum ...
- 每天学五分钟 Liunx 011 | sudo
回顾前两节,在 001 中介绍了怎么添加用户及用户组,在 010 中介绍了从 client 端 ssh 到 server 的详细过程,那么接下来要介绍的就是是登陆到 server 之后如何切换用户了. ...
- 项目使用 GlobalExceptionHandler 与 @RestControllerAdvice自定义异常 二
未经博主允许不得转载: 自定义异常,不仅需要定义符合自己业务的异常状态码,也需要定义自己项目中的异常封装.记录下自己手敲代码中的异常封装: 1.定义一个枚举类,枚举类中定义状态码及状态码描述,再定义一 ...
- 【STM32】如何将资源烧写至外部flash,如spi-flash
STM32将资源烧写至外部flash方式大致分为通过IDE与应用程序一起和通过CubeProgranmmer单独烧写两种: 方式一.使用IDE加载烧写算法,烧录应用程序时一并写入,具体就是修改分散加载 ...
- Razor 语法@Html.DropDownList,根据List集合或者枚举生成Select标签
1.根据List集合生成Select标签,根据数据库数据换成SelectListItem集合 Action 方法(也可使用下方的List集合的扩展方法): 1 var selectList = DBL ...
- [转帖]RHEL/CentOS 7的systemd target及其中的multi-user.target
在RHEL/CentOS 6中,使用SysV init和Upstart,通过预定义一组Runlevels(从0到6)表示不同的执行模式. [root@myhost app]# ll /etc/rc.d ...
- [转帖]记一次探索内存cache优化之旅
https://developer.aliyun.com/article/972803 背景 项目上线以来,曾出现上传镜像.下发镜像时可用内存不足,性能发生抖动的情况.研究发现是容器的 page ca ...
- 常见的docker hub mirror镜像仓库
阿里云(杭州) https://registry.cn-hangzhou.aliyuncs.com 阿里云(上海) https://registry.cn-shanghai.aliyuncs.com ...