.Net Core 3.0 内置依赖注入:举例
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
本文根据蔚来汽车.Net 开发部 罗霄老师的分享 进行整理,在这里声明,表示感谢。
本文讲解如何使用.Net Core 3.0的内置依赖(Microsoft.Extensions.DependencyInjection),而不是使用第三方的依赖注入的插件。
实例生命周期的形态:
Transient:容器获取的实例都是全新创建的。使用方法:AddTransient<TClass,Class>
Scoped:在每次http请求都会创建一个新的实例 AddScoped<TClass,Class> :
Singleton:单例:始终都是一个实例:AddSingleton<TClass,Class>,
通过一个支付实例来讲解内置依赖:
通过一个简单地下订单和支付来一步步的讲解如何使用内置依赖。
1、使用.net core 3.0 创建一个web项目。
2、选择API程序,.NET Core 3.0,取消HTTS安全协议
3、创建一个Order(下订单)控制器。
4、创建一个参数模型,防止以后修改
-
-
namespace Order.Model
-
{
-
public class OrderItem
-
{
-
public string PayType { get; set; }
-
}
-
}
创建一个控制器,并创建一个方法CreateOrder();
-
namespace Order.Controllers
-
{
-
[Route("api/[controller]")]//路由格式
-
[ApiController]
-
public class OrderController : ControllerBase
-
{
-
[HttpPost]//Post请求
-
[Route("CreateOrder")]//路由名
-
public string CreateOrder([FromBody]OrderItem orderItem)//自动匹配参数体
-
{
-
return $"我使用{orderItem.PayType}方式支付。";//返回string类型的参数
-
}
-
}
-
}
调用:
返回结果:
5、为实现控制翻转,创建一个接口文件夹和一个实现文件夹,一个IPaymentService接口和两个AliPayService、WechatPayService实现类,并继承接口
接口:
-
-
public interface IPaymentService
-
{
-
string Pay();
-
}
实现类:
-
public class WechatPayService : IPaymentService
-
{
-
public string Pay()
-
{
-
return "Wechat支付成功";
-
}
-
}
-
public class AliPayService : IPaymentService
-
{
-
public string Pay()
-
{
-
return "AliPay支付成功";
-
}
-
}
6、注册,接口和实现类的注册在startup.cs中的
-
public void ConfigureServices(IServiceCollection services)
-
{
-
services.AddTransient<IPaymentService, WechatPayService>();//注入wechatpay,每次调用都创建一个新的实例
-
services.AddTransient<IPaymentService, AliPayService>();//注入alipay,每次调用都创建一个新的实例
-
services.AddControllers();
-
}
7、通过构造方法进行解析
-
[Route("api/[controller]")]
-
[ApiController]
-
public class OrderController : ControllerBase
-
{
-
private readonly IPaymentService _paymentService;
-
public OrderController(IPaymentService paymentService)
-
{
-
_paymentService = paymentService;
-
}
-
[HttpPost]
-
[Route("CreateOrder")]
-
public string CreateOrder([FromBody]OrderItem orderItem)
-
{
-
string payResult = _paymentService.Pay();
-
return $"我使用{orderItem.PayType}方式支付,支付结果为:{payResult}";
-
}
-
}
8、调用测试
这时候就出现错误了,我们明明试行用微信支付,最后调用了alipay的实现类,那么未解决这个问题,我们在接口中定义一个Name属性,用于表示实现类。然后在实现类中将其实现。
9、实现解析不同的类:
添加Name属性
-
public interface IPaymentService
-
{
-
/// <summary>
-
/// 标识实现类
-
/// </summary>
-
public string Name { get; }
-
string Pay();
-
}
-
public class AliPayService : IPaymentService
-
{
-
public string Name => "aliPay";
-
-
public string Pay()
-
{
-
return "AliPay支付成功";
-
}
-
}
-
public class WechatPayService : IPaymentService
-
{
-
public string Name => "wechatPay";
-
public string Pay()
-
{
-
return "Wechat支付成功";
-
}
-
}
将接口解析为IEnumerable<IPaymentService>
然后再去根据Name,使用Linq去解析特定的支付实现类。然后在调用方法即可
-
[Route("api/[controller]")]
-
[ApiController]
-
public class OrderController : ControllerBase
-
{
-
private readonly IEnumerable<IPaymentService> _paymentServiceList;
-
public OrderController(IEnumerable<IPaymentService> paymentService)
-
{
-
_paymentServiceList = paymentService;
-
}
-
[HttpPost]
-
[Route("CreateOrder")]
-
public string CreateOrder([FromBody]OrderItem orderItem)
-
{
-
IPaymentService paymentService = _paymentServiceList.FirstOrDefault(pay => pay.Name == orderItem.PayType);
-
string payResult = paymentService.Pay();
-
return $"我使用{orderItem.PayType}方式支付,支付结果为:{payResult}";
-
}
-
}
最终测试:
至此,.net Core 3.0内置依赖就实现了。
4、定义一个参数模型,防止参数会不断修改
5、创建一个接口文件夹和一个实现类文件夹,并创建两个接口和两个支付方式(wechat、alipay)
6、使用控制器的构造方法获得支付实例。
7、创建支付接口
.Net Core 3.0 内置依赖注入:举例的更多相关文章
- 第四节:配置的读取、StartUp类、内置依赖注入和扩展改造
一. 配置的读取 在Asp.Net Core中,有一个 appsettings.json 文件,用于存储相应的配置信息,读取的时,要通过构造函数注入:IConfiguration Configurat ...
- ASP.NET Core 1.0基础之依赖注入
来源https://docs.asp.net/en/latest/fundamentals/dependency-injection.html ASP.NET Core 1.0在设计上原生就支持和 ...
- 如何在.NET Core控制台程序中使用依赖注入
背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...
- .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC
原文:https://www.cnblogs.com/artech/p/net-core-di-01.html 一.流程控制的反转 IoC的全名Inverse of Control,翻译成中文就是“控 ...
- .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]
为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...
- .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]
原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...
- .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式
原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...
- Spark2.1.0——内置RPC框架详解
Spark2.1.0——内置RPC框架详解 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通.用户文件与Jar包的上传.节点间的Shuffle过程.Block数据的复制与备份等 ...
- ASP.NET Core - 在ActionFilter中使用依赖注入
上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档.发现除了IActionFilter.I ...
随机推荐
- shell脚本编程进阶
在linux shell中,通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行更为复杂的逻辑判断,我们就需要使用流程控制语句来支持了.所谓流程控制既是通过使用流程控制语句对程 ...
- 【软件工程】Beta冲刺(1/5)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 tomcat的学习与实现 服务器后端部署,API接口的beta版实现 后端代码 ...
- FreeMarker学习(常用指令)
参考:http://freemarker.foofun.cn/dgui_quickstart_basics.html assign: 使用该指令你可以创建一个新的变量, 或者替换一个已经存在的变量 a ...
- EBS 查看输出HTML报表问题总结
问题一: 请求输出格式为HTML(如下图,默认浏览器输出),希望 查看输出 的时候能够实现excel输出. 解决方法: 路径:系统管理员/安装/浏览器选项 注:维护如下记录 文件格式:HTML ...
- Python——决策树实战:california房价预测
Python——决策树实战:california房价预测 编译环境:Anaconda.Jupyter Notebook 首先,导入模块: import pandas as pd import matp ...
- 使用 docker 快速安装 oracle 11g
前言 我们在手动安装oracle数据库时,安装步骤纷繁复杂,耗时较长 在此介绍如何使用docker快速安装oracle 11g 一.docker 及其安装环境 操作系统: [root@centos7 ...
- qt+opencv编译环境的配置
第一步:安装与配置Qt 从https://account.qt.io/downloads下载Qt,并注册账户.开始安装.首先下载qt-opensource-windows-x86-mingw482_o ...
- linux下如何将dts转换成dtb?
答: 使用dtc工具,如: <kernel source code dir>/scripts/dtc/dtc -I dts -O dtb -o <dtb filename> & ...
- vuex中的babel编译mapGetters/mapActions报错解决方法
vex使用...mapActions报错解决办法 vuex2增加了mapGetters和mapActions的方法,借助stage2的Object Rest Operator 所在通过 methods ...
- mybatis之分页查询
1)StudentDao.java /** * 持久层*/ public class StudentDao { /** * 增加学生 */ public void add(Student studen ...