标签:
用基于过滤器的方式处理,
比如 : 提交订单之前,要做如下的事:
类似这样把订单加入到数据库前的各种判断,各种逻辑,都可以拆成一个一个的 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