.net core 泛型接口(类)注入IOC容器

NET CORE 泛型接口或者泛型类注入方式


前言

主要讲解.NET CORE 泛型接口或者泛型类如何注入自带的IOC容器中。

一、接口是泛型,实现类不是泛型,该如何注入?

1.先建一个泛型接口:IValidateData<TData>

代码如下:

/// <summary>
    /// 定义了校验数据接⼝,也增加了泛型⽤于不同类型的接⼝可以传递不同的类型参数
    /// </summary>
    /// <typeparam name="TData"></typeparam>
    public interface IValidateData<TData> where TData : PurchaseValiedateBaseDataModel
    {
        /// <summary>
        /// 默认公共的
        /// </summary>
        public string ActionCode { get; set; }
        /// <summary>
        /// 校验数据
        /// </summary>
        /// <param name="data">需要校验的数据</param>
        /// <returns>返回校验的结果</returns>
        public Task<ValidateResult> ValidateDataAsync(TData data);
    }

2.建个实现步骤1的实现类:ValidateRights

说明:RightsValidateModel 类是继承了 PurchaseValiedateBaseDataModel 类,PurchaseValiedateBaseDataModel里只是公共的属性。

代码如下(示例):

/// <summary>
    /// 校验权限 (基础类,如果后面FBA精品和FBA精铺有不同的校验,则只要继承该类 重写 ValidateDataAsync())
    /// </summary>
    public class ValidateRights : IValidateData<RightsValidateModel> 
    {
        /// <summary>
        /// 校验code,用于不同流程筛选校验类的。很重要。
        /// </summary>
        //public override string ActionCode => ValidateEnum.CommonValidate.ToString();

        public virtual string ActionCode { get { return _actionCode; } set { _actionCode = value; } }

        public string _actionCode = ValidateEnum.CommonValidate.ToString();


        /// <summary>
        /// 校验权限
        /// </summary>
        /// <param name="data">权限编码</param>
        /// <returns></returns>
        public virtual Task<ValidateResult> ValidateDataAsync(RightsValidateModel data)
        {
            if (string.IsNullOrEmpty(data.Rights))
            {
                return Task.FromResult(ValidateResult.Fail(failureMessage: "权限编号为空"));
            }

            return Task.FromResult(ValidateResult.Success);
        }
    }

 3.建个注入IOC容器的扩展类:StrategyRegisterExtend.cs

/// <summary>
    /// 策略模式封装的业务在这里统一注册 2022.8.5
    /// </summary>
    public static class StrategyRegisterExtend
    {
        public static void AddStrategyService(this IServiceCollection services)
        {
          services.AddSingleton<IValidateData<PurchaseValiedateBaseDataModel>, ValidateRights>();//
        }
}

4.在 Program.cs里注入:

  builder.Services.AddStrategyService();

二、接口是泛型,实现类也泛型,该如何注入?

  1. 新建一个策略模式上下文接口:IValidateStrategyContext<TData>
        /// <summary>
        /// 校验策略管理接口
        /// </summary>
        /// <typeparam name="TData"></typeparam>
        public interface IValidateStrategyContext<TData> where TData : PurchaseValiedateBaseDataModel
        {
            /// <summary>
            /// 默认公共的
            /// </summary>
            public abstract string ActionCode { get; set; }
    
            /// <summary>
            /// 校验数据
            /// </summary>
            /// <param name="data"></param>
            /// <returns>并且返回校验结果</returns>
            public Task<ValidateResult> ValidateDataAsync(TData data);
        }

    2.新建一个实现了上下文接口的子类:ValidateStrategyContext<TData> 

  2.  /// <summary>
        /// 策略服务 泛型类型。统一对外调用的类。
        /// 策略模式的控制类主要是外部可以传递不同的策略实现,在通过统⼀的⽅法执⾏优惠策略计算。
        /// </summary>
        /// <typeparam name="TData">需要校验的类型</typeparam>
        /// 这种写法 自带IOC里注册可以,但是在Autofac里不行。所以换成下面这种写法了。
        public class ValidateStrategyContext<TData> :  IValidateStrategyContext<TData> where TData : PurchaseValiedateBaseDataModel
        {
            /// <summary>
            /// 获取各种状态服务。
            /// </summary>
            private IServiceProvider _serviceProvider;
    
            public string ActionCode { get => _actionCode; set => _actionCode = value; }
    
            /// <summary>
            /// 默认公共的
            /// </summary>
            private string _actionCode = ValidateEnum.PurchaseConfigValidate.ToString();
    
            /// <summary>
            /// 策略上下文构造函数
            /// </summary>
            /// <param name="serviceProvider">注入获取服务的接口</param>
            public ValidateStrategyContext(IServiceProvider serviceProvider)
            {
                _serviceProvider = serviceProvider;
            }
    
            public async Task<ValidateResult> ValidateDataAsync(TData data)
            {
                 return Task.FromResult(ValidateResult.Success);
    
            }
        }

    3.在 StrategyRegisterExtend.cs 类里注入

  3. /// <summary>
        /// 策略模式封装的业务在这里统一注册 2022.8.5
        /// </summary>
        public static class StrategyRegisterExtend
        {
            public static void AddStrategyService(this IServiceCollection services)
            {
              services.AddSingleton<IValidateData<PurchaseValiedateBaseDataModel>, ValidateRights>();//
    services.AddSingleton(typeof(IValidateStrategyContext<>), typeof(ValidateStrategyContext<>));
            }
    }

总结

以上就介绍了两种情况的泛型接口注入方式,还有一种未介绍,接口不是泛型,继承了接口的类是泛型的。可以自己试试。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值