本文根据蔚来汽车.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、创建支付接口