.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 ...
随机推荐
- 微信小程序swiper禁止用户手动滑动
最近做一个项目,由于用到了竖向swiper,导致占用屏幕过大,用户滑动总是滑动到swiper组件,页面无法向下拉动,于是找各种办法禁止用户手动滑动swiper组件. 经过网上一番查找,网友们也是闹洞大 ...
- AtomicReference、AtomicStampedReference 和 AtomicMarkableReference
这三个都是自 JDK1.5 开始加入到 java.util.concurrent.atomic 下面的.他们都可以在 lock-free 的情况下以原子的方式更新对象引用. 一.AtomicRefer ...
- sklearn——train_test_split 随机划分训练集和测试集
sklearn——train_test_split 随机划分训练集和测试集 sklearn.model_selection.train_test_split随机划分训练集和测试集 官网文档:http: ...
- Graphics 使用一点点注意
Form_Load 事件下绘制的结果会被 paint 刷新掉.也就等于没有绘制一样. Graphics g = this.CreateGraphics(); g.DrawRectangle(new P ...
- [go]socket编程
socket特性 总是成对出现 是全双工的(同时支持收发)(两个channel绑在一起) 应用程序 - cs模式(客户端开发) - bs模式(web开发) net包api基础 都是客户端主动发数据(c ...
- AES对称加密解密类
import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...
- MATLAB学习(九)系统聚类
>> X=rand(100,2); >> Y=pdist(X,'euclidean'); >> Z = linkage(Y,'average'); > ...
- Vue 组件中 data 为什么必须是函数
原文地址 vue组件中的data必须是函数 类比引用数据类型 Object是引用数据类型,如果不用function 返回,每个组件的data 都是内存的同一个地址,一个数据改变了其他也改变了; jav ...
- shell脚本常见的结构化函数
if-then if command then command fi if-then-else if command then command else command fi 嵌套if if comm ...
- 《精通并发与Netty》学习笔记(04 - Google Protobuf介绍)
一 .Google Protobuf 介绍 protobuf是google团队开发的用于高效存储和读取结构化数据的工具,是Google的编解码技术,在业界十分流行,通过代码生成工具可以生成不同语言版本 ...