zoukankan      html  css  js  c++  java
  • Caliburn笔记过滤器管理(IFilterManager)(wpf框架)

         过滤器用于装饰对象本身和对象中的方法.如下图

    image

    具体介绍可见此

    http://caliburn.codeplex.com/wikipage?title=Filters&referringTitle=Documentation

    IFilterManager

    IFilterManager接口为过滤器管理器,用于存放过滤器接口,每个Action都有一个过滤器管理器

    1.IRescue

    捕获错误

    public class Calculator
    {
    
        [Rescue(Priority=1)]
        public int Divide(int left, int right)
        {
            throw new Exception("error");
            return left / right;
        }
    }

    2.IPreProcessor

    在Action触发之前触发或阻止Action触发

    3.IPostProcessor

    在Action触发之后触发

    public class PreProcessorAttribute : Attribute, IPreProcessor
       {
           #region IPreProcessor Members
    
           public bool AffectsTriggers
           {
               get { return true; }
           }
    
           public bool Execute(IRoutedMessage message, IInteractionNode handlingNode, object[] parameters)
           {
               Console.WriteLine("PreProcessor");
               return true;
           }
    
           #endregion
    
           #region IFilter Members
    
           public int Priority
           {
               get { return 1; }
           }
    
           #endregion
       }
    
       public class PostProcessorAttribute : Attribute, IPostProcessor
       {
    
           #region IPostProcessor Members
    
           public void Execute(IRoutedMessage message, IInteractionNode handlingNode, MessageProcessingOutcome outcome)
           {
               Console.WriteLine("PostProcessor");
           }
    
           #endregion
    
           #region IFilter Members
    
           public int Priority { get; set; }
    
           #endregion
       }


    看下执行结果

    [PreProcessorAttribute()]
    [PostProcessorAttribute()]
    public int Divide(int left, int right)
    {
        Console.WriteLine("Action");
        return left / right;
    }

     

    image

    过滤器与Action是密切相关的,我们可以来看下Action内部的实现,看下面代码,上面的流程就非常的清晰了

    public override void Execute(ActionMessage actionMessage, IInteractionNode handlingNode, object context)
    {
        try
        {
            var parameters = _messageBinder.DetermineParameters(
                actionMessage,
                _requirements,
                handlingNode,
                context
                );
    
            foreach (var filter in _filters.PreProcessors)
            {
                if (!filter.Execute(actionMessage, handlingNode, parameters)) return;
            }
    
            var outcome = new MessageProcessingOutcome(
                _method.Invoke(handlingNode.MessageHandler.Unwrap(), parameters),
                _method.Info.ReturnType,
                false
                );
    
            foreach (var filter in _filters.PostProcessors)
            {
                filter.Execute(actionMessage, handlingNode, outcome);
            }
    
            HandleOutcome(actionMessage, handlingNode, outcome);
        }
        catch (Exception ex)
        {
            if(!TryApplyRescue(actionMessage, handlingNode, ex))
                throw;
            OnCompleted();
        }
    }


    可以使用以上特性定义自己需要的过滤器,建议不要重新定义Action,若要这么做的话就需要管理好过滤器的生命周期,或者有意更改生命周期

  • 相关阅读:
    vue echarts 遇到的bug之一 无法渲染的问题
    前端SSR方案调研
    【读书笔记】数据结构与算法js描述-链表实现
    【转发】数组,字符串常用方法
    【转】README.md 语法汇总
    webpack 配置遇到的坑
    原生audio 实现音频播放器功能
    活动抽奖组件设计
    理解vue-loader
    kpi sql 积累
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1635956.html
Copyright © 2011-2022 走看看