項目案例【Net Core】如何註入多個服務實現類
阿新 • • 發佈:2019-04-16
val sage ons bre order exce let else 錯誤信息
需求
庫表保存時,需要校驗邏輯.
提交時有更深層次校驗.
**狀態,還有特殊校驗
接口
寫一個通用的校驗接口,這裏定義了校驗時間.每個階段校驗可能需要考慮順序,增加一個順序字段.
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 0; } }public bool Check(OrderModel orderModel, List<string> warnMsg) { //內部邏輯 如:年齡小於18歲,校驗失敗
return true; } }
public class CheckCaStatus : IOrcderCheck { /// <summary> /// 校驗排序,默認制定為0即可 /// </summary> public int SortNum { get{ return 0; } } 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==1) { return true;//電子簽成功 } if(res.WarnResult!=null) { warnMsg.Add(res.WarnResult.Message); //不完全電子簽的,提示完成電子簽 } else { warnMsg.Add("請完成協議簽署後再提交"); } return warnMsg.Count == 0; } }
註冊封裝
擴展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 > 0) { return new WarnResult(string.Join(‘|‘, msg)); }
項目案例【Net Core】如何註入多個服務實現類