.Net Core 3.0 内置依赖注入:举例

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值