zoukankan      html  css  js  c++  java
  • 用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的允许]

  • 相关阅读:
    接口缓存--把接口放在redis数据库中,减少访问量
    使用vue和drf后台进行登录页面和注册页面(本文大概的疏通一下前后台是怎么交互的)
    vue导入css,js和放置html代码
    存储过程
    触发器
    视图
    pymysql模块使用
    权限管理
    多表数据查询
    单表数据查询
  • 原文地址:https://www.cnblogs.com/kaneboy/p/2436769.html
Copyright © 2011-2022 走看看