05 | 依赖注入:良好架构的起点

注册完毕之后,想替换某些组件的某些部分时,可以使用 Replace 和 RemoveAll

services.AddSingleton<IOrderService>(new OrderService());
services.Replace(ServiceDescriptor.Singleton<IOrderService, OrderServiceEx>());// 替换掉注册的第一个实现

启动程序,输出如下:

获取到服务实例:DependencyInjectionDemo.Services.OrderServiceEx:25560520

从结果看出,注册的 OrderService 被替换为 OrderServiceEx

下面介绍 RemoveAll

services.AddSingleton<IOrderService>(new OrderService());
services.AddSingleton<IOrderService, OrderServiceEx>();
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/witskeeper/geektime/tree/master/samples/DependencyInjectionDemo

.NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(下)相关推荐

  1. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

    05 | 依赖注入:良好架构的起点 为什么要使用依赖注入框架 借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 ASP.NET Core ...

  2. .NET Core开发实战(定义API的最佳实践)Source Generators版

    前言 极客时间上的<.NET Core开发实战>是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601 ...

  3. .NET Core开发实战(第8课:配置框架:让服务无缝适应各种环境)--学习笔记

    08 | 配置框架:让服务无缝适应各种环境 配置是应用程序发布到各种环境的必备能力,这一节开始详细讲解 ASP.NET Core 的配置框架 配置框架的核心包有两个,一个抽象包,一个实现包 Micro ...

  4. .NET Core开发实战(第34课:MediatR:轻松实现命令查询职责分离模式(CQRS))--学习笔记(上)...

    34 | MediatR:轻松实现命令查询职责分离模式(CQRS) 核心对象 IMeditator IRequese.IRequest IRequestHandler<in TRequest, ...

  5. .NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(下)...

    25 | 路由与终结点:如何规划好你的Web API 自定义约束实现了路由约束接口,它只有一个 Match 方法,这个方法传入了 Http 当前的 httpContext,route,routeKey ...

  6. .NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(下)...

    18 | 日志框架:聊聊记日志的最佳姿势 除了使用 CreateLogger 指定 logger 的名称,实际上还可以借助容器来构造 logger,通常情况下我们会定义自己的类 namespace L ...

  7. 如何为 .NET Core 3.0 中 WPF 配置依赖注入 ?

    咨询区 user842818: 我非常熟悉 ASP.NET Core 和它开箱即用的依赖注入支持,当 Controller 需要依赖注入时,可以在 构造函数 中以参数的形式来实现,这个IOC的理念相当 ...

  8. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

    本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样理解控制反转,假设有一个人他有一部A品牌手机,他用手机进行听歌.打 ...

  9. ASP.NET Core如何在ActionFilterAttribute里做依赖注入

    点击蓝字 关注我 在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入.但是如何给过滤器ActionFilterAttrib ...

最新文章

  1. windows系统杀掉explorer.exe进程后黑屏
  2. Android Studio 运行、编译卡死的解决办法
  3. 手机开发平台指南、教程和资料介绍
  4. 网站导航目录要该如何优化?
  5. leetcode 57. 插入区间
  6. c/c++ 求字符数组长度(非所占内存大小)
  7. 实时操作系统和优先级反转
  8. 三次样条插值matlab,Matlab关于三次样条插值
  9. 虚拟机里linux7关不了,虚拟机上CentOS 7关闭防火墙操作
  10. pycharm: connot find declaration to go to
  11. 【洛谷 P3384】树链剖分【详解树链剖分】
  12. python爬虫-book118
  13. 阿里云大学Linux学习路线图(学+测)重磅上线!
  14. oracle expdp parallel,关于EXPDP中的PARALLEL参数
  15. 45度回合RPG网页游戏《烽烟OL》v1.3正式开源!
  16. MACD怎样判断趋势?巧用MACD指标研判市场的强弱!(实例)
  17. 1031 查验身份证 (15 分) python
  18. JDBC与ODBC的区别与应用
  19. AIX磁盘管理基础知识
  20. Android RenRen SDK 接入教程

热门文章

  1. ACPI知识学习笔记
  2. 用户帐户控制设置_创建快捷方式以避免用户帐户控制弹出式快捷方式
  3. 打游戏要存进度-备忘录模式
  4. Python之路【第一篇】:环境搭建
  5. ELK 中的elasticsearch 集群的部署
  6. Ansible 一步一步从入门到精通(一)
  7. Google Chrome 总提示flash插件过期,用命令行模式解决
  8. SQLite.NET (32位) 在64位环境中无法正常调试
  9. web页面在线编辑功能
  10. JavaME程序 Run Anywhere-- 利用反射机制来动态加载声