1. 程式人生 > >項目案例【Net Core】如何註入多個服務實現類

項目案例【Net Core】如何註入多個服務實現類

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】如何註入多個服務實現類