`

ContextAttribute与ContextBoundObject应用开发(转)

    博客分类:
  • C#
 
阅读更多

 

ContextAttribute与ContextBoundObject应用开发

这两天因开发的需要,需要分析和构建针对ContextAttribute极其ContextBoundContext相关的拦截器的内容,所以今天一上班就开发分析ContextAttribute与ContextBoundContext之间的应用关系,在查看了相关网友的资源后开始了我的分析之路。
  首先:我建立了一个ContextAttribute的子类和一个普通的Attribute子类,分别附加在ContextBoundContext子类和普通子类上。代码如下:

using System;
using System.Collections.Generic;
using System.Text;

using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Activation;

namespace ContextDemo
{
    public class DemoContextAttribute : ContextAttribute
    {
        public DemoContextAttribute()
            : base("DemoContextAttribute")
        {
            Console.WriteLine("Call 'DemoContextAttribute' - 'Constructor' ");
        }

    }


    public class NonContextAttribute : Attribute
    {
        public NonContextAttribute()
        {
            Console.WriteLine("Call 'NonContextAttribute' - 'Constructor' ");
        }

    }


    [DemoContext]
    [NonContext]
    public class DemoContextBoundObject : ContextBoundObject
    {
        public DemoContextBoundObject()
        {
            Console.WriteLine("Call 'DemoContextBoundObject' - 'Constructor' ");
        }

    }


    [DemoContext]
    [NonContext]
    public class NonContextBoundObject
    {
        public NonContextBoundObject()
        {
            Console.WriteLine("Call 'NonContextBoundObject' - 'Constructor'  ");
        }

    }


    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Begin Main ");

            DemoContextBoundObject dcbo = new DemoContextBoundObject();
            NonContextBoundObject ncbo = new NonContextBoundObject();

            Console.WriteLine("End Main ");

            Console.Read();
        }

    }

}

执行的结果如下:

这里可以看出,只有继承于ContextAttribute的子类在ContextBoundObject上使用才会进行构造。其实都没有进行调用。
 然后:我将ContextAttribute之下的虚方法都进行了一次继承并且添加相应的查看信息来分析各个方法的调用顺序,代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Activation;

namespace ContextDemo {
    public class DemoContextAttribute : ContextAttribute {
        public DemoContextAttribute()
            : base("DemoContextAttribute"{
            Console.WriteLine("Call 'DemoContextAttribute' - 'Constructor' ");
        }


        public override void Freeze(Context newContext) {
            Console.WriteLine("Call 'DemoContextAttribute' - 'Freeze' ");
        }


        public override void GetPropertiesForNewContext(IConstructionCallMessage ctorMsg) {
            Console.WriteLine("Call 'DemoContextAttribute' - 'GetPropertiesForNewContext' ");
            base.GetPropertiesForNewContext(ctorMsg);
        }


        public override bool IsContextOK(Context ctx, IConstructionCallMessage ctorMsg) {
            Console.WriteLine("Call 'DemoContextAttribute' - 'IsContextOK' ");
            return false;
        }


        public override bool IsNewContextOK(Context newCtx) {
            Console.WriteLine("Call 'DemoContextAttribute' - 'IsNewContextOK' ");
            return base.IsNewContextOK(newCtx);
        }

    }


    [DemoContext]
    public class DemoContextBoundObject : ContextBoundObject {
        public DemoContextBoundObject() {
            Console.WriteLine("Call 'DemoContextBoundObject' - 'Constructor' ");
        }

    }


    class Program {
        static void Main(string[] args) {
            Console.WriteLine("Begin Main ");
            new DemoContextBoundObject();
            Console.WriteLine("End Main ");
            Console.Read();
        }

    }

}


执行的结果显示如下:

这里可能以看出在执行的过程中,先建立与ContextBoundObject相关的ContextAttribute对象。并且向ContextAttribute对象询间IsContextOK,环境怎么样还可以吗。这里我先从这个IsContextOK开始进行分析。
这里通过修改代码查看运行的结果发现IsContextOk返回的结果为False,表示对当前环境有点不满意啊,将这里的IsContextOK直接返回True会是什么情况呢。修改代码执行显示结果如下:
 public override bool IsContextOK(Context ctx, IConstructionCallMessage ctorMsg) {
            Console.WriteLine("Call 'DemoContextAttribute' - 'IsContextOK' ");
            return true;
        }

看来这个方式就是用来确认当前环境是否满足要求的,如果满足则不执行。这里可以查看一下这一部分的过程: 
   CRL先询问当前环境是否满足要求,如果满足则不继续执行,如果不满足则先初始化新环境的GetPropertiesForNewContext,再将其Freeze,再询问IsNewContextOK如果没有问题则成功,如果在这里返回false,将引发一个Remoting的异常。

 

分享到:
评论

相关推荐

    spring+xifre 发布webservice服务

    Xfire就是这样一个工具,它允许开发者用Java创建SOAP Web服务,简化了服务的开发、部署和消费过程。 在Spring中集成Xfire,我们首先需要引入相关的依赖。在Maven项目中,可以在pom.xml文件中添加Xfire的依赖,例如...

    详解Spring mvc DispatchServlet 实现机制

    2. **BeanWrapper的创建**:将Servlet实例转换为`BeanWrapper`,以便使用Spring的依赖注入功能来注入属性,如`contextAttribute`、`contextClass`、`namespace`和`contextConfigLocation`等。 3. **初始化servlet...

    SpringMVC的源码解析

    SpringMVC是一个流行的Java web开发框架,用于构建高效、可维护的MVC应用程序。本文将深入探讨SpringMVC的核心组件DispatcherServlet的初始化过程及其处理请求的机制。 DispatcherServlet是SpringMVC的入口点,它是...

    pandas-1.3.5-cp37-cp37m-macosx_10_9_x86_64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.002)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于ssm框架+mysql+jsp实现的监考安排与查询系统

    有学生和教师两种角色 登录和注册模块 考场信息模块 考试信息模块 点我收藏 功能 监考安排模块 考场类型模块 系统公告模块 个人中心模块: 1、修改个人信息,可以上传图片 2、我的收藏列表 账号管理模块 服务模块 eclipse或者idea 均可以运行 jdk1.8 apache-maven-3.6 mysql5.7及以上 tomcat 8.0及以上版本

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.001)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于MATLAB车牌识别代码实现代码【含界面GUI】.zip

    matlab

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于Web的毕业设计选题系统的设计与实现(springboot+vue+mysql+说明文档).zip

    随着高等教育的普及和毕业设计的日益重要,为了方便教师、学生和管理员进行毕业设计的选题和管理,我们开发了这款基于Web的毕业设计选题系统。 该系统主要包括教师管理、院系管理、学生管理等多个模块。在教师管理模块中,管理员可以新增、删除教师信息,并查看教师的详细资料,方便进行教师资源的分配和管理。院系管理模块则允许管理员对各个院系的信息进行管理和维护,确保信息的准确性和完整性。 学生管理模块是系统的核心之一,它提供了学生选题、任务书管理、开题报告管理、开题成绩管理等功能。学生可以在此模块中进行毕业设计的选题,并上传任务书和开题报告,管理员和教师则可以对学生的报告进行审阅和评分。 此外,系统还具备课题分类管理和课题信息管理功能,方便对毕业设计课题进行分类和归档,提高管理效率。在线留言功能则为学生、教师和管理员提供了一个交流互动的平台,可以就毕业设计相关问题进行讨论和解答。 整个系统设计简洁明了,操作便捷,大大提高了毕业设计的选题和管理效率,为高等教育的发展做出了积极贡献。

    机器学习(预测模型):2000年至2015年期间193个国家的预期寿命和相关健康因素的数据

    这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    婚恋网站 SSM毕业设计 附带论文.zip

    婚恋网站 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

Global site tag (gtag.js) - Google Analytics