码迷,mamicode.com
首页 > 其他好文 > 详细

基于过滤器的处理方式

时间:2016-05-13 11:33:58      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

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

 

比如 : 提交订单之前,要做如下的事:

 

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

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

 

这样做 可以 随时扯下一个 逻辑,也可以随时加一个逻辑。 改一个逻辑不会影响其它逻辑。

 

还会使代码 更有条理。

-----------------------------------------------------------------------------------------------------------------------------------------------

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

 

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

 

---------------------------------------------------------------------------------------------------------------------------------------------

还是惯例,直接上代码:

 

使用:

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, 就写到这吧。 

 

基于过滤器的处理方式

标签:

原文地址:http://www.cnblogs.com/red-fox/p/5486829.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!