.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 ...
随机推荐
- 性能测试 | Linux系统top命令中的io使用率,很多人都误解了它的具体含义
body{ text-align:left; width:80%; margin:10px 100px; } 最近在做连续数据流的缓冲系统,C语言代码实现后,粗略测试了下,功能上应该没有问题.那么,接 ...
- matlab gui界面设计记录
我们要进行的程序是彩色图像处理试验示例,用这个程序来练习我们的gui前台设计. 程序功能介绍:具有彩色图像处理及保存和音乐播放功能效果如下图 2 在MATLAB的命令窗口中输入guide命令,打开gu ...
- python -v 和-V
python -v 小写v:这是版本信息,包括库版本 python -V 大写v:只看python的版本
- Centos7 - mysql 5.5.62 tar.gz 方式安装
安装准备 Mariadb 去除 由于CentOS7自带的是 Mariadb, 所以先来删除他吧... 1. 查找版本 # rpm -qa|grep mariadb 执行命令后会出现类似 MariaDB ...
- ElementTree
http://effbot.org/zone/element-index.htm#installation http://effbot.org/zone/element-xpath.htm
- js大文件上传
一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不能这样上传了.我这里分享一下我自己开发的一套大文件上传控件 ...
- nginx配置静态资源关闭访问日志
location ~ .*\.(css|js|gif|png|jpg|jpeg|bmp|swf)$ { root $root_path; access_log off; }
- DRF视图-基类
2个视图基类 REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 为了区分上面请求和响应的代码,我们再次创建一个新的子应用: python manage.py star ...
- 今天发现一个Window系统服务增删改查神器:NSSM
官网地址:https://nssm.cc Win10系统下这个:https://nssm.cc/ci/nssm-2.24-101-g897c7ad.zip 官方的帮助,英语的,可以大概看一下: htt ...
- 整合AD RMS与EX 2010。
1.点击开始菜单, 选择所有程 序,展开 Mi cros oft Excha nge Server 2010 ,打开Excha nge Ma na gement Cons ol e,选择收件人配 ...