.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 ...
随机推荐
- nginx 实现高并发和高负载
一.Nginx是如何实现高并发的 service nginx start之后,然后输入#ps -ef|grep nginx,会发现Nginx有一个master进程和若干个worker进程,这些work ...
- http协议格式详解
参考:https://www.jianshu.com/p/8fe93a14754c 一.URI结构 HTTP使用统一资源标识符(URI)来传输数据和建立连接.URL(统一资源定位符)是一种特殊种类的U ...
- html5验证自适应
// 移动端跳转 var OS = function() { var a = navigator.userAgent, b = /(?:Android)/.test(a), d = /(?:Firef ...
- Sublime text3中文版 无法安装插件There are no packages available for installation问题的解决。
说起来差点没被气死,我当时的情况已经是要疯了,连他们的域名都ping不通,我还想着,咋地,要倒闭了? 首选项->插件设置->Package Control->默认 里边的这个配置项 ...
- idea svn 主干分支切换
使用快捷键ctrl+t或者点击工具栏中的 vcs update 出现如下窗口:点击复选框,在框2中进行选择你要切换的分支的地址,点击OK即可 : 查看是否切换成功可以再version control ...
- (转载)PIM-SM协议初探(一)路由角色选举
PIM是Protocol Independent Multicast(协议无关组播)的简称,表示可以利用静态路由或者任意单播路由协议(包括RIP.OSPF.IS-IS.BGP等)所生成的单播路由表为I ...
- 使用kubeadm安装kubernetes1.12.2版本脚本【h】
Master节点脚本: #!/bin/sh#使用系统的PATH环境export PATH=`echo $PATH` #停止firewall防火墙,并禁止开机自启动 systemctl stop fir ...
- Vue 使用eventBus 实现兄弟组件间的通信
实现方式: 主要是在相互通信的兄弟组件之中,都引入一个新的vue实例,然后通过分别调用这个实例的事件触发事件广播 和监听来实现通信和参数传递. 需求: a页面tree的增删改后,数据还是之前的老数据 ...
- LeetCode.1207-唯一的元素出现次数(Unique Number of Occurrences)
这是小川的第次更新,第篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第269题(顺位题号是1207).给定一个整数数组arr,当且仅当该数组中每个元素的出现次数唯一时,返回tr ...
- 使用PowerShell 自动安装IIS 及自动部署网站
执行环境:Windows Server 2012 R2 安装iis核心代码,可自定义安装项 注意这里不能使用add-windowsfeature "Web-Filtering", ...