原文:.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、创建一个参数模型,防止以后修改


  1. namespace Order.Model
  2. {
  3. public class OrderItem
  4. {
  5. public string PayType { get; set; }
  6. }
  7. }

创建一个控制器,并创建一个方法CreateOrder();


  1. namespace Order.Controllers
  2. {
  3. [Route("api/[controller]")]//路由格式
  4. [ApiController]
  5. public class OrderController : ControllerBase
  6. {
  7. [HttpPost]//Post请求
  8. [Route("CreateOrder")]//路由名
  9. public string CreateOrder([FromBody]OrderItem orderItem)//自动匹配参数体
  10. {
  11. return $"我使用{orderItem.PayType}方式支付。";//返回string类型的参数
  12. }
  13. }
  14. }

调用:

返回结果:

5、为实现控制翻转,创建一个接口文件夹和一个实现文件夹,一个IPaymentService接口和两个AliPayService、WechatPayService实现类,并继承接口

接口:


  1. public interface IPaymentService
  2. {
  3. string Pay();
  4. }

实现类:


  1. public class WechatPayService : IPaymentService
  2. {
  3. public string Pay()
  4. {
  5. return "Wechat支付成功";
  6. }
  7. }

  1. public class AliPayService : IPaymentService
  2. {
  3. public string Pay()
  4. {
  5. return "AliPay支付成功";
  6. }
  7. }

6、注册,接口和实现类的注册在startup.cs中的


  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddTransient<IPaymentService, WechatPayService>();//注入wechatpay,每次调用都创建一个新的实例
  4. services.AddTransient<IPaymentService, AliPayService>();//注入alipay,每次调用都创建一个新的实例
  5. services.AddControllers();
  6. }

7、通过构造方法进行解析


  1. [Route("api/[controller]")]
  2. [ApiController]
  3. public class OrderController : ControllerBase
  4. {
  5. private readonly IPaymentService _paymentService;
  6. public OrderController(IPaymentService paymentService)
  7. {
  8. _paymentService = paymentService;
  9. }
  10. [HttpPost]
  11. [Route("CreateOrder")]
  12. public string CreateOrder([FromBody]OrderItem orderItem)
  13. {
  14. string payResult = _paymentService.Pay();
  15. return $"我使用{orderItem.PayType}方式支付,支付结果为:{payResult}";
  16. }
  17. }

8、调用测试

这时候就出现错误了,我们明明试行用微信支付,最后调用了alipay的实现类,那么未解决这个问题,我们在接口中定义一个Name属性,用于表示实现类。然后在实现类中将其实现。

9、实现解析不同的类:

添加Name属性


  1. public interface IPaymentService
  2. {
  3. /// <summary>
  4. /// 标识实现类
  5. /// </summary>
  6. public string Name { get; }
  7. string Pay();
  8. }

  1. public class AliPayService : IPaymentService
  2. {
  3. public string Name => "aliPay";
  4. public string Pay()
  5. {
  6. return "AliPay支付成功";
  7. }
  8. }

  1. public class WechatPayService : IPaymentService
  2. {
  3. public string Name => "wechatPay";
  4. public string Pay()
  5. {
  6. return "Wechat支付成功";
  7. }
  8. }

将接口解析为IEnumerable<IPaymentService>

然后再去根据Name,使用Linq去解析特定的支付实现类。然后在调用方法即可


  1. [Route("api/[controller]")]
  2. [ApiController]
  3. public class OrderController : ControllerBase
  4. {
  5. private readonly IEnumerable<IPaymentService> _paymentServiceList;
  6. public OrderController(IEnumerable<IPaymentService> paymentService)
  7. {
  8. _paymentServiceList = paymentService;
  9. }
  10. [HttpPost]
  11. [Route("CreateOrder")]
  12. public string CreateOrder([FromBody]OrderItem orderItem)
  13. {
  14. IPaymentService paymentService = _paymentServiceList.FirstOrDefault(pay => pay.Name == orderItem.PayType);
  15. string payResult = paymentService.Pay();
  16. return $"我使用{orderItem.PayType}方式支付,支付结果为:{payResult}";
  17. }
  18. }

最终测试:

至此,.net Core 3.0内置依赖就实现了。

4、定义一个参数模型,防止参数会不断修改

5、创建一个接口文件夹和一个实现类文件夹,并创建两个接口和两个支付方式(wechat、alipay)

6、使用控制器的构造方法获得支付实例。

7、创建支付接口

.Net Core 3.0 内置依赖注入:举例的更多相关文章

  1. 第四节:配置的读取、StartUp类、内置依赖注入和扩展改造

    一. 配置的读取 在Asp.Net Core中,有一个 appsettings.json 文件,用于存储相应的配置信息,读取的时,要通过构造函数注入:IConfiguration Configurat ...

  2. ASP.NET Core 1.0基础之依赖注入

      来源https://docs.asp.net/en/latest/fundamentals/dependency-injection.html ASP.NET Core 1.0在设计上原生就支持和 ...

  3. 如何在.NET Core控制台程序中使用依赖注入

    背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...

  4. .NET CORE学习笔记系列(2)——依赖注入【1】控制反转IOC

    原文:https://www.cnblogs.com/artech/p/net-core-di-01.html 一.流程控制的反转 IoC的全名Inverse of Control,翻译成中文就是“控 ...

  5. .NET CORE学习笔记系列(2)——依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在上篇中我们介绍了Cat的基本编程模式,接下来我们就来聊聊Cat的 ...

  6. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  7. .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...

  8. Spark2.1.0——内置RPC框架详解

    Spark2.1.0——内置RPC框架详解 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通.用户文件与Jar包的上传.节点间的Shuffle过程.Block数据的复制与备份等 ...

  9. ASP.NET Core - 在ActionFilter中使用依赖注入

    上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档.发现除了IActionFilter.I ...

随机推荐

  1. JS基础_垃圾回收(GC)

    垃圾回收(GC) 程序运行过程中也会产生垃圾,这些垃圾积攒过多以后,会导致程序运行的速度过慢,所以我门需要一个垃圾回收的机制,来处理程序运行过程中产生的垃圾 当一个对象没有任何的变量或属性对它进行引用 ...

  2. CNN中感受野大小的计算

    1 感受野的概念 从直观上讲,感受野就是视觉感受区域的大小.在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小. 2 感受野 ...

  3. spring boot 全局异常处理及自定义异常类

    全局异常处理: 在处理controller层抛出的自定义异常时,可以实现@ControllerAdvice注解捕获,配合@ExceptionHandler来增强所有的@requestMapping方法 ...

  4. git分布式版本管理系统

    Git是分布式版本管理系统Svn是集中式版本管理系统 git速度快,适合大规模协同开发 什么是分布式版本管理系统 假如有10个人,每个人的代码库都是独立的,自己想进行代码提交回滚都可以,无需链接中央服 ...

  5. webstrom配置node语法提示

    一.mac下打开设置 二.输入node,找到node.js npm,勾选上对勾就好了. 第三.按住ctr,点击右键可以点进去就可以了.

  6. 终端less命令执行完之后怎样退出

    Linux中的less命令主要用来浏览文件内容,与more命令的用法相似,不同于more命令的是,less命令可往回卷动浏览以看过的部分,less 的用法比起 more 更加的有弹性.如果想退出les ...

  7. 找不到FileProvider类怎么办?找不到R资源怎么办?APPT2错误怎么办?

    坑2: 在使用上述解决方案时,需要加入android.support.v4.content.FileProvider这个类,当时我没有这个包.但是在引入相应的依赖包后,各种异常就出现了. 先是把And ...

  8. Jmeter: PATCH方法无法发送参数的暂时解决方法

    Jmeter: PATCH方法无法发送参数的暂时解决方法 最近在做API测试,前面的GET这些HTTP Request方法都无压力,顺利解决. 但碰到PATCH方法时,发现无法通过. 通过对比,发现P ...

  9. tomcat中的server.xml元素详解

    附:Tomcat加载顺序 加载类和资源的顺序为: 1./Web-INF/classes 2./Web-INF/lib/*.jar 3.Bootstrap 4.System 5.$CATALINA_HO ...

  10. 软件开发的SOLID原则

    再次回顾以前潘加宇老师将的软件开放的原则. SOLID: 单一责任原则 S 开放封闭原则 O 里氏代换原则 L 接口分离原则 I 依赖反转原则 D 所有编程都是维护编程,因为你很少写原创代码.只有你在 ...