.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 ...
随机推荐
- 来谈谈MySQL的临时表,到底是个什么东西,以及怎么样产生的
介绍临时表之前,我们首先来看这么一句语句: CREATE TABLE `words` ( `id` ) NOT NULL AUTO_INCREMENT, `word` ) DEFAULT NULL, ...
- nginx 的使用
nginx 反向代理,并拥有其高效的性能,并发效果好,是解决跨域最好的选择 nginx 的使用 1. 下载:在官网上下载 window 系统的 nginx 网址:http://nginx.org/en ...
- springboot 整合logback(有全套的日志配置文件)
logback介绍:基于Log4j基础上大量改良,不能单独使用,推荐配合日志框架SLF4J来使用,可以和springboot很好的整合,也是springboot默认推荐的. 1.在resources ...
- 在Eclipse中使用WindowBuilder设计Swing程序
在Eclipse中使用WindowBuilder设计Swing程序 Swing程序表示Java的客户端窗体程序,除了通过手动编写代码的方式设计Swing程序之外,Eclipse中还提供了一种W ...
- 侧方、s弯道、坡起相关
侧方: 方向盘上端对准路中箭头直行,当前面箭头头部尖角刚刚消失,停车,挂倒档,倒,当箭头尾部快要消失时右打死,侧身看左后视镜(这时可以稍微踩一下离合控制速度为低速),当出现库底角回正,坐直,当左侧第一 ...
- 转 MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法
http://blog.sina.com.cn/s/blog_637e04c9010117ri.html 1 问题 [root@localhost mysql]# /etc/rc.d/init.d/m ...
- powerdesigner通过er图生成mysql执行文件
PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...
- JAVA 基础编程练习题16 【程序 16 输入 9*9 表】
16 [程序 16 输入 9*9 表] 题目:输出 9*9 口诀. 程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列. package cskaoyan; public class ...
- 用js的方式运行c程序之webassemly
在这里就不科普webassemly的作用以及好处了,请自行百度. 那么,怎么通过js的方式在浏览器中运行c程序呢,其中原理如下: 可能另一张图会更详细: 1.安装emscripten 说明文档地址:h ...
- LeetCode.1200-最小绝对值差(Minimum Absolute Difference)
这是小川的第次更新,第篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第268题(顺位题号是1200).给定一个由不同的整数组成的数组arr,找到所有对元素,其中任意两个元素的绝 ...