Skip to content

过虑器

Henry edited this page Oct 12, 2019 · 1 revision

很多时候需要在API的外层添中一些处理,如果验证、错误和逻辑缓存处理等;组件提供过虑器来完成这一功能,过虑器是基于Attribute实现可以标记在控制器或方法之上。所有逻辑过虑器必须继承EventNext.ActionFilterAttribute并产现相关方法,具体规则如下:

ActionFilterAttribute

    [AttributeUsage(AttributeTargets.Method|AttributeTargets.Class,AllowMultiple =true)]
    public class ActionFilterAttribute : Attribute, IEventActionExecuteHandler
    {
        public virtual void Executed(EventCenter center, EventActionHandler handler, IEventInput input, IEventOutput output)
        {
            
        }
        public virtual bool Executing(EventCenter center, EventActionHandler handler, IEventInput input, IEventOutput output)
        {
            return true;
        }
    }
  • Executing方法

    控制器执行前执行,方法返回一个布尔值,如果为true则继续往下走,否则结束当前请求。

  • Executed方法

    控制器执行后执行的过程

定义执行输

    public class ProcessFilter:EventNext.ActionFilterAttribute
    {
        public override bool Executing(EventCenter center, EventActionHandler handler, IEventInput input, IEventOutput output)
        {
            Console.WriteLine($"{input.EventPath} executing");
            return base.Executing(center, handler, input, output);
        }

        public override void Executed(EventCenter center, EventActionHandler handler, IEventInput input, IEventOutput output)
        {
            base.Executed(center, handler, input, output);
            Console.WriteLine($"{input.EventPath} executed");
        }
    }

以上定义一个执行过程输出的过虑器,可以把过虑器添加到方法或控制器上。

    [ProcessFilter]
    [Service(typeof(IUserService))]
    public class UserService : IUserService

运行日志

image

取消执行

    public class CancelFilter : EventNext.ActionFilterAttribute
    {
        public override bool Executing(EventCenter center, EventActionHandler handler, IEventInput input, IEventOutput output)
        {
            output.EventError = EventError.NotFound;
            output.Data = new object[] {$"{input.EventPath} not found!" };
            return false;
        }
    }

只要把这个过虑器标记到方法或控制器上,对应的方法则返回一个not found的错误。