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 => ();
public virtual string ActionCode { get { return _actionCode; } set { _actionCode = value; } }
public string _actionCode = ();
/// <summary>
/// 校验权限
/// </summary>
/// <param name="data">权限编码</param>
/// <returns></returns>
public virtual Task<ValidateResult> ValidateDataAsync(RightsValidateModel data)
{
if (())
{
return ((failureMessage: "权限编号为空"));
}
return ();
}
}
3.建个注入IOC容器的扩展类:
/// <summary>
/// 策略模式封装的业务在这里统一注册 2022.8.5
/// </summary>
public static class StrategyRegisterExtend
{
public static void AddStrategyService(this IServiceCollection services)
{
<IValidateData<PurchaseValiedateBaseDataModel>, ValidateRights>();//
}
}
4.在 里注入:
();
二、接口是泛型,实现类也泛型,该如何注入?
-
新建一个策略模式上下文接口: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>
-
/// <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 = (); /// <summary> /// 策略上下文构造函数 /// </summary> /// <param name="serviceProvider">注入获取服务的接口</param> public ValidateStrategyContext(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public async Task<ValidateResult> ValidateDataAsync(TData data) { return (); } }
3.在 类里注入
-
/// <summary> /// 策略模式封装的业务在这里统一注册 2022.8.5 /// </summary> public static class StrategyRegisterExtend { public static void AddStrategyService(this IServiceCollection services) { <IValidateData<PurchaseValiedateBaseDataModel>, ValidateRights>();// (typeof(IValidateStrategyContext<>), typeof(ValidateStrategyContext<>)); } }
总结
以上就介绍了两种情况的泛型接口注入方式,还有一种未介绍,接口不是泛型,继承了接口的类是泛型的。可以自己试试。