需求

库表保存时,需要校验逻辑.

提交时有更深层次校验.

**状态,还有特殊校验

接口

写一个通用的校验接口,这里定义了校验时间.每个阶段校验可能需要考虑顺序,增加一个顺序字段.

public interface IOrcderCheck
{
ECheckTime CheckTime { get; }
bool Check(OrderModel orderModel, List<string> warnMsg); /// <summary>
/// 校验排序,默认制定为0即可
/// </summary>
int SortNum { get; }
}

实现类2个

public class CheckAge : IOrcderCheck
{
public ECheckTime CheckTime => ECheckTime.BeforeSign;
/// <summary>
/// 校验排序,默认制定为0即可
/// </summary>
public int SortNum { get { return ; } }
public bool Check(OrderModel orderModel, List<string> warnMsg)
{
//内部逻辑 如:年龄小于18岁,校验失败
return true;
}
}
 public class CheckCaStatus : IOrcderCheck
{
/// <summary>
/// 校验排序,默认制定为0即可
/// </summary>
public int SortNum { get { return ; } }
public ECheckTime CheckTime => ECheckTime.BeforeSubmit;
DataAccess _da;
IDBContext _db;
CfcaManager _cfcaManager;
IUserInfoRepository _userInfoRepository;
public CheckCaStatus(IIndex<string, DataAccess> daArr, IIndex<string, IDBContext> dbArr,CfcaManager cfcaManager,IUserInfoRepository userInfoRepository)
{
this._da = daArr["acs"];
this._db = dbArr["acs"];
this._cfcaManager = cfcaManager;
this._userInfoRepository = userInfoRepository;
}public bool Check(OrderModel orderModel, List<string> warnMsg)
{
if (CheckDelStatus(orderModel))
{
warnMsg.Add("此申请已被删除,无法提交");
return false;
}
//判断是否电子签成功
var orderId = orderModel.OrderId;
var res= this._cfcaManager.CheckCaForSubmit(orderId, ECaCategory.Camain);
if(res.Value==)
{
return true;//电子签成功
}
if(res.WarnResult!=null)
{
warnMsg.Add(res.WarnResult.Message); //不完全电子签的,提示完成电子签
}
else
{
warnMsg.Add("请完成协议签署后再提交");
}
return warnMsg.Count == ;
} }

注册封装

扩展IServiceCollection 接口方法 AddCheckRules,注册校验类

校验入口
ValidateOrderData
传入校验实体类和校验时间
orderModel, eCheckTime
 
  public static class OrderCheckServiceCollectionExtensions
{ public static IServiceCollection AddCheckRules(this IServiceCollection services)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
} services.AddSingleton<IOrcderCheck, CheckAge>();//计算年龄+贷款 > 65
services.AddSingleton<IOrcderCheck, CheckCaStatus>();//电子签名状态校验 判断删除状态 return services;
}
/// <summary>
/// 通用订单提交校验入口.
/// </summary>
/// <param name="rules"></param>
/// <param name="orderModel"></param>
/// <param name="eCheckTime"></param>
/// <returns></returns>
public static List<string> ValidateOrderData(this IEnumerable<IOrcderCheck> rules, OrderModel orderModel, ECheckTime eCheckTime)
{
List<string> warnMsg = new List<string>(); var newRules = rules.Where(r => r.CheckTime <= eCheckTime).OrderBy(o => o.SortNum);
foreach (var rule in newRules)
{ if (!rule.Check(orderModel, warnMsg))
break;
}
return warnMsg;
} }

调用

注册

 services.AddCheckRules();

构造注入

IEnumerable<IOrcderCheck> _orderChecks;
public OrderCRepository(
IEnumerable<IOrcderCheck> orderChecks
)
{
this._orderChecks = orderChecks;
}

函数调用

这里直接使用函数,判断校验类错误信息.

var msg = _orderChecks.ValidateOrderData(orderModel, ECheckTime.BeforeSubmit);
if (msg.Count > )
{
return new WarnResult(string.Join('|', msg));
}

项目案例【Net Core】如何注入多个服务实现类的更多相关文章

  1. ASP.NET Core依赖注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来. 服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了 ...

  2. 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...

  3. NET 5 依赖注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来. 服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了 ...

  4. ASP.NET Core依赖注入系统学习教程:关于服务注册使用到的方法

    在.NET Core的依赖注入框架中,服务注册的信息将会被封装成ServiceDescriptor对象,而这些对象都会存储在IServiceCollection接口类型表示的集合中,另外,IServi ...

  5. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  6. .NET 4.5+项目迁移.NET Core的问题记录

    .NET 4.5+项目迁移.NET Core的问题记录 这几天试着把目前的开发框架迁移到新的.net core平台,中间遇到的问题在这里简单记录一下. 迁移过程遇到的最大的问题IOC容器.我目前使用的 ...

  7. NET Core依赖注入解读&使用Autofac替代实现

    NET Core依赖注入解读&使用Autofac替代实现 标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. ...

  8. 实现BUG自动检测 - ASP.NET Core依赖注入

    我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...

  9. 全面理解 ASP.NET Core 依赖注入

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

随机推荐

  1. Android WebView 缓存

    android很多情况是使用webView用来显示界面,但是webview的加载速度略慢,想让这个webview更快一些所以需要使用缓存,在没有更新的时候使用缓存技术来提高速度.总体来讲有两个方案可以 ...

  2. python全栈目录

    Python Python开发[第一篇]:初识 Python开发[第二篇]:基本数据类型 Python开发[第三篇]:函数 Python开发[第四篇]:杂货铺 Python开发[第五篇]:模块 Pyt ...

  3. 10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡

    分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟程序猿无疑心中会激动一番(或许这是判断是否是一个标准阿猿的标准吧)! 首先自己从宏观把控一下,通过上网科普自 ...

  4. kafka基础知识点

    1.安装: 1.1. 前置安装要求:java + zookeeper 1.2. 下载安装包:http://mirros.cnnic.cn/apache/kafka/0.9.00/kafka_2.10- ...

  5. 自己动手用原生实现 bind/call/apply

    大家好!!!注册一年多的第一篇博客. 自我介绍: 本人非计算机专业出身,转行进入前端半年时间,写的东西可能观赏性不强,一起进步吧道友们... 接下来的一段时间, 我都会不定期整理自己理解的js知识点, ...

  6. SUSE12SP3-Mycat(2)Schema.xml配置详解

    简介 Schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库.表.分片规则.DataNode 以及 DataSource.弄懂这些配置,是正确使用 MyCat 的前 ...

  7. Intellij IDEA 阅读源码的 4 个绝技,我必须分享给你!

    前段时间分享了<阅读跟踪 Java 源码的几个小技巧>是基于 Eclipse 版本的,看大家的留言都是想要 IDEA 版本的源码阅读技巧. 所以,为了满足众多 IDEA 粉丝的要求,栈长我 ...

  8. nginx解决反向代理超时

    最近在公司windows服务器部署nginx前端项目时 因为业务需求 有个有个接口数据量很大,请求时长在很大可能超过一分钟 然后一直遇到了504 Gateway Time-out 在网上查了很多资料都 ...

  9. struts2框架搭建学习遇到的问题

    遇到的两个问题 1Dispatcher initialization failed: 严重: Dispatcher initialization failed java.lang.RuntimeExc ...

  10. 从ASP.NET Core2.2到3.0你可能会遇到这些问题

    趁着假期的时间所以想重新学习下微软的官方文档来巩固下基础知识.我们都知道微软目前已经发布了.NET Core3.0的第三个预览版,同时我家里的电脑也安装了vs2019.So,就用vs2019+.NET ...