• 用Lostinet的ContextBoundModel来实现前置和后置条件检查


    我以前一篇文章介绍过XC#,用XC#可以非常方便的在一个Method上插入前置和后置条件的检查。XC#的实现是通过在编译时根据插入的指定Attribute动态在原有代码上加入相应的代码。

    LostinetContextBoundModel(以下简称CBM)是一个AOP.NET的框架,在CBM的基础上,可以非常方便的实现类似XC#的前置和后置条件检查,而且具有更大的灵活性,因为我们可以自己定制各种检查的条件。

    下面示范在一个Person类的SetAge()方法和GetAge()方法上应用前置和后置条件:

    public class Person : AspectObject
    {
    ...
    public void SetAge([AgeArg] Int32 age)
    {
        _iAge = age;

    }

    [AgeResult]
    public Int32 GetAge()
    {
        return _iAge;
    }

    上面SetAge()方法需要检查传入的参数age是否如何年龄所需的要求(比如大于16岁,小于150岁),而GetAge()方法则需要检查返回的值是否如何要求。加在参数和方法上的两个Attribute,AgeArg和AgeResult都是实现了Lostinet.ContextBoundModel.IMessageHandlerAttribute接口的Attribute,所以可以用于标示拦截。

    下面演示了AgeResultAttribute的实现:

    [AttributeUsage(AttributeTargets.Method)]
    public class AgeResultAttribute : Attribute, IMessageHandler, IMessageHandlerAttribute
    {
    ...
    public IMethodReturnMessage ProcessMessage(IMethodCallMessage mcm, AspectObjectProxy proxy, MessageHandlerQueue queue)
    {
        IMethodReturnMessage result = queue.InvokeNext(mcm, proxy);
        if (Convert.ToInt32(result.ReturnValue) < 0)
        {
            throw new ApplicationException("返回值不能是" + result.ReturnValue.ToString());
        }
        return result;
    }
    }


    在ProcessMessage()方法中,代码首先调用了“真实”的方法代码,然后对返回值进行检测。

    如果感兴趣,点击这里下载这个示范项目的源码。在这里下载ContextBoundModel的最新的版本。

    [本文中所有对ContextBoundModel的资料的引用,都得到了Lostinet的允许]

  • 相关阅读:
    python全局变量与局部变量
    TCP的三次握手四次挥手
    关于Http的面试题
    HSTS
    关于网络安全攻防知识
    http详解
    python中的f''、b''、u''、r''
    常见SQL Server导入导出数据的几个工具
    chrome浏览器中 F12 功能的简单介绍
    Sqlcmd使用详解
  • 原文地址:https://www.cnblogs.com/kaneboy/p/2436769.html
Copyright © 2020-2023  润新知