您的位置:首页 > 其它

基于过滤器的处理方式

2016-05-12 18:14 381 查看
用基于过滤器的方式处理,

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

在用户提订单后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, 就写到这吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: