基于过滤器的处理方式

用基于过滤器的方式处理,git

 

好比 : 提交订单以前,要作以下的事:github

 

  1. 在用户提订单后5秒后不能再提交。 
  2. 对订单的各参数的检查
  3. 对订单判断是不是重需求单
  4. 对提交的订单作额外参数更新等 

相似这样把订单加入到数据库前的各类判断,各类逻辑,均可以拆成一个一个的 Filter ,等全部的Filter 都执行完才作真正的后续逻辑。数据库

 

这样作 能够 随时扯下一个 逻辑,也能够随时加一个逻辑。 改一个逻辑不会影响其它逻辑。this

 

还会使代码 更有条理。spa

-----------------------------------------------------------------------------------------------------------------------------------------------code

写了一个类库,使用时只要使用写FIilter , 及最后的业务逻辑代码就能够了。blog

 

类库已提到 Github( https://github.com/jinshuai/FilterRunner.Net)get

 

---------------------------------------------------------------------------------------------------------------------------------------------string

仍是惯例,直接上代码:it

 

使用:

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            var user = new User() {Name="Tom",Age=68};

            var runner = new FilterRunner.Runner<User>(user, p =>
            {

                Console.WriteLine("Hello " +p.Name);

                return new FilterRunner.RunnerMessage() {IsSuccess=true,Message=" ok "};

            });

            //add filter
            runner.Filters.Add(new CheckUserRunnerFilter<User>());


            //run 
           var result= runner.Run();

            Console.WriteLine("-----------"+result.Message+"---------------");
            Console.ReadKey();

        }

    }



    internal class User
    {
        public string Name { get; set; }

        public short Age { get; set; }

    }
}

 

 

类库:

/// <summary>
    ///  过虑器
    /// </summary>
  public interface IRunnerFilter<in T>
  {
      /// <summary>
      /// 过滤器执行顺序
      /// </summary>
      int Sequence { get; set; }

      /// <summary>
      /// 过滤执行
      /// </summary>
      /// <param name="targetObj"></param>
      /// <param name="isContinueRunNext"></param>
      /// <returns></returns>
      RunnerMessage Run(T targetObj, out bool isContinueRunNext);
  }

 

 

 /// <summary>
    /// 返回消息
    /// </summary>
   public class RunnerMessage
    {
       /// <summary>
       /// 执行是否成功
       /// </summary>
       public bool IsSuccess { get;set;}
        
       /// <summary>
       /// 状态码
       /// </summary>
        public int StatusCode { get;set;}
       
       /// <summary>
       ///  执行消息
       /// </summary>
        public string Message { get;set;}
        

       /// <summary>
       /// 额外的数据
       /// </summary>
        public Dictionary<string,object> DataExt { get;set;}

    }

 

 

 /// <summary>
    /// 分部过滤执行器
    /// </summary>
    /// <typeparam name="T">处理的对像类型 </typeparam>
    public class Runner<T>
    {
        protected T _targetObj = default(T);

        //执行对像
        protected readonly Func<T,RunnerMessage> Executor = null;

        /// <summary>
        /// 过滤器
        /// </summary>
        public List<IRunnerFilter<T>> Filters = new List<IRunnerFilter<T>>();


        /// <summary>
        /// 构造
        /// </summary>
        /// <param name="obj">要处理的对像</param>
        /// <param name="runner"></param>
        public Runner(T obj, Func<T,RunnerMessage> runner)
        {
            _targetObj = obj;
            Executor = runner;
        }



        /// <summary>
        /// 运行
        /// </summary>
        /// <returns></returns>
        public virtual RunnerMessage Run()
        {
            var isContinueRunNext = true;
            var result = RunFilters(out isContinueRunNext);

            if (isContinueRunNext == false)
            {
                return result;
            }

            if (Executor == null)
            {
                throw new Exception("Runner is Null ! ");
            }

            return Executor(_targetObj);
        }


        /// <summary>
        /// 运行全部的 Filter
        /// </summary>
        /// <param name="isContinueRunNext"></param>
        /// <returns></returns>
        protected virtual RunnerMessage RunFilters(out bool isContinueRunNext)
        {
            isContinueRunNext = true;

            if (Filters == null || Filters.Count <= 0)
            {
                return null;
            }

            RunnerMessage result = null;

            Filters = Filters.Where(filter => filter != null).OrderBy(p => p.Sequence).ToList();

            foreach (var filter in Filters)
            {
                result = filter.Run(this._targetObj, out isContinueRunNext);

                //若是不用继续运行了就跳出
                if (false == isContinueRunNext)
                {
                    return result;
                }
            }

            return result;

        }

    }

 

 

ok, 就写到这吧。 

相关文章
相关标签/搜索