本文根据蔚来汽车.Net 开发部 罗霄老师的分享 进行整理,在这里声明,表示感谢。
本文讲解如何使用.Net Core 3.0的内置依赖(Microsoft.Extensions.DependencyInjection),而不是使用第三方的依赖注入的插件。
Transient:容器获取的实例都是全新创建的。使用方法:AddTransient<TClass,Class>
Scoped:在每次http请求都会创建一个新的实例 AddScoped<TClass,Class> :
Singleton:单例:始终都是一个实例:AddSingleton<TClass,Class>,
通过一个简单地下订单和支付来一步步的讲解如何使用内置依赖。
-
- 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、创建支付接口
原文:https://www.cnblogs.com/lonelyxmas/p/11913785.html