基于过滤器的处理方式
2016-05-12 18:14
381 查看
用基于过滤器的方式处理,
比如 : 提交订单之前,要做如下的事:
在用户提订单后5秒后不能再提交。
对订单的各参数的检查
对订单判断是否是重需求单
对提交的订单做额外参数更新等
类似这样把订单加入到数据库前的各种判断,各种逻辑,都可以拆成一个一个的 Filter ,等所有的Filter 都执行完才做真正的后续逻辑。
这样做 可以 随时扯下一个 逻辑,也可以随时加一个逻辑。 改一个逻辑不会影响其它逻辑。
还会使代码 更有条理。
-----------------------------------------------------------------------------------------------------------------------------------------------
写了一个类库,使用时只要使用写FIilter , 及最后的业务逻辑代码就可以了。
类库已提到 Github( https://github.com/jinshuai/FilterRunner.Net)
---------------------------------------------------------------------------------------------------------------------------------------------
还是惯例,直接上代码:
使用:
类库:
ok, 就写到这吧。
比如 : 提交订单之前,要做如下的事:
在用户提订单后5秒后不能再提交。
对订单的各参数的检查
对订单判断是否是重需求单
对提交的订单做额外参数更新等
类似这样把订单加入到数据库前的各种判断,各种逻辑,都可以拆成一个一个的 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, 就写到这吧。
相关文章推荐
- android.support.v4.view.NestedScrollingChild cannot be resolved
- 选择排序法
- Android开发本地及网络Mp3音乐播放器(十六)歌词显示及滚动事件实现、ViewPager使用
- Android开发本地及网络Mp3音乐播放器(十六)歌词显示及滚动事件实现、ViewPager使用
- 顺序队列C/C++实现
- declare-styleable:自定义控件的属性
- spring boot 下 500 404 错误页面处理
- 内部类
- android点滴之HandlerThread的用法
- python并发编程之多进程、多线程、异步和协程
- spring boot 下 500 404 错误页面处理
- 冒泡排序法
- Android应用如何监听自己是否被卸载及卸载反馈功能的实现(第三版)
- 对9种方法的十个数求和的总结
- PHP之——thinkphp3.x中数据的查询-区间查询、统计查询等等
- java string byte之间的转换
- curl和wget
- 选择法
- 高级排序
- my information