当前位置: 首页 > 编程日记 > 正文

老调重弹:插件式框架开发的一个简单应用

VS 2008

    最近要做一个应用程序检测程序,就是要检测服务器上各应用程序的运行情况,由于各应用程序的差异,很难做一个统一的探测程序,于是决定对任意一个应用程序都采用独立的一条探测规则。
    为了开发、部署的方便,考虑使用插件式开发。

本文案例包含三个项目:
1) Tristan.DetectContract 
    插件接口(契约),定义了探测的行为,以及传递的参数
2) Tristan.DetectCenter
    探测主程序,引用Tristan.DetectContract
3) CompareSvcDetector
    插件1,用于探测一个名为"CompareSvc"的应用程序的插件,引用 Tristan.DetectContract

1. 插件接口
    
1.1 IDetector
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Tristan.DetectContract {
    
public interface IDetector {

        
/**//// <summary>
        
/// 线程控制开关
        
/// </summary>

        bool ThreadFlag {
            
get;
            
set;
        }

        
/**//// <summary>
        
/// 探测
        
/// </summary>
        
/// <param name="onNormal"></param>
        
/// <param name="onError"></param>

        void Detector(Action<DetectEventArgs> onNormal, Action<DetectEventArgs> onError);
    }

}

1.2 DetectEventArgs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Tristan.DetectContract {
    
public class DetectEventArgs {
        
/**//// <summary>
        
/// 探测结果
        
/// </summary>

        public DetectResult DetectResult {
            
get;
            
set;
        }

        
/**//// <summary>
        
/// 探测任务编码
        
/// </summary>

        public string DetectCode {
            
get;
            
set;
        }

        
/**//// <summary>
        
/// 提示信息
        
/// </summary>

        public string Message {
            
get;
            
set;
        }

    }

    
public enum DetectResult 
        Normal,
        Error
    }

}

    
2. 探测程序

using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using Tristan.DetectContract;

namespace Tristan.DetectCenter {
    
class Program {
        
static void Main(string[] args) {
            
//从指定文件夹读取dll
            string[] files = Directory.GetFiles("PlugIn""*.dll");
            
foreach (var f in files) {
                
//通过反射加载程序集
                Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + f);

                
//获取程序集内定义的类
                Type[] types = assembly.GetTypes();
                
foreach (Type t in types) {

                    
//判断类 t 是否实现了 IDetector接口
                    IDetector d = Activator.CreateInstance(t) as IDetector;
                    
if (d != null{
                        
//置探测线程开关
                        d.ThreadFlag = true;
                        
//开始探测
                        d.Detector(new Action<DetectEventArgs>(SucceedHandler), new Action<DetectEventArgs>(ErrorHandler));
                    }

                }

            }

            Console.Read();
        }

        
static void SucceedHandler(DetectEventArgs e) {
            Console.WriteLine(e.DetectCode 
+ "," + e.DetectResult.ToString() + "," + e.Message);
        }

        
static void ErrorHandler(DetectEventArgs e) {
            Console.WriteLine(e.DetectCode 
+ "," + e.DetectResult.ToString() + "," + e.Message);
        }

    }

}

3. 插件1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Tristan.DetectContract;

namespace CompareSvcDetector {
    
public class CompareSvcDetector : IDetector {

        
private string detectCode = "XX0001";

        
IDetector Members#region IDetector Members

        
public bool ThreadFlag {
            
get;
            
set;
        }

        
public void Detector(Action<DetectEventArgs> onNormal, Action<DetectEventArgs> onError) {
            
            ThreadPool.QueueUserWorkItem(
new WaitCallback(delegate(object o) {
                
while (ThreadFlag) {
                    Random r 
= new Random();
                    
int i = r.Next(10);
                    
if (i < 5{
                        onNormal(
new DetectEventArgs() { DetectResult = DetectResult.Normal, DetectCode = detectCode, Message = i.ToString() });
                    }

                    
if (i >= 5{
                        onError(
new DetectEventArgs() { DetectResult = DetectResult.Error, DetectCode = detectCode, Message = i.ToString() });
                    }

                    Thread.Sleep(
2000);
                }

            }
));
        }


        
#endregion

    }

}

    这里,我通过生成随机数的方式来模拟探测到应用程序的正常和异常状态。

    编译CompareSvcDetector得 CompareSvcDetector.dll,将该文件置于 Tristan.DetectCenter安装目录的 PlugIn 文件夹下

运行:


转载于:https://www.cnblogs.com/guozhijian/archive/2008/02/23/1078375.html

相关文章:

mathjax测试

O(∩_∩)O哈哈~&#xff0c;新开通博客测试。 mathjax公式测试。以下是latex公式 $a^2b^2c^2$ <!--more--> 多输入一点东东。新浪娱乐讯 1月3日&#xff0c;网络红人奶茶妹妹章泽天清空微博&#xff0c;而其男友刘强东也删除了“小天是我见过最单纯善良的人…只求以后可以…

Docker镜像使用

当运行容器时&#xff0c;使用的镜像如果在本地中不存在&#xff0c;docker 就会自动从 docker 镜像仓库中下载&#xff0c;默认是从 Docker Hub 公共镜像源下载。 下面我们来学习&#xff1a; 1、管理和使用本地 Docker 主机镜像2、创建镜像列出镜像列表 我们可以使用 docker …

(C++)1018 锤子剪刀布

#include<cstdio>int Map(char c){//将字母映射到数字 if(cB){return 0;}else if(cC){return 1;}else{return 2;} } //对决函数&#xff0c;返回1表示甲胜&#xff0c;0表示平局&#xff0c;-1表示乙胜 int ko(int i1,int i2){if((i11)%3i2){//甲胜 return 1;}else if(i…

我的软考之路(九)——总结篇

经过两个月的备战&#xff0c;软考总算结束了。软考虽然结束了&#xff0c;但是还需要简单的总结一下得与失。我从时间安排&#xff0c;到讲课做真题简单的回顾一下软考的整个过程。 时间安排&#xff1a; 对于时间的安排&#xff0c;整个小组成员每个人都有自己的看法&#xf…

problem-solving-with-algorithms-and-data-structure-usingpython(使用python解决算法和数据结构) -- 基本数据结构(二)...

中缀、前缀和后缀表达式 1. 前缀表达式符号要求所有运算符在它们处理的两个操作数之前。 2. 后缀表达式要求其操作符在相应的操作数之后。 考虑表达式 A B * C &#xff0c; A B C * 是等价的后缀表达式。操作数 A&#xff0c;B 和 C 保持在它们的相对位置&#xff0c;只有操…

赢在中国(08-02-27)

在Google Calendar中设置了赢在中国的日程&#xff0c;结果没有发短信给我&#xff08;是不是可以起诉它呢&#xff1f;和Google打打官司&#xff0c;可是成名的好机会啊&#xff1a;&#xff09;&#xff09;后面一节还是看到了&#xff0c;印象比较深的是最后一位做教育的选手…

(C++)1041 考试座位号

//B1041 #include<cstdio> //直接将试机号作为下标 struct student{long long no;int sit; };int main(){int n1,n2;//总共参与考试的人数&#xff0c;来迟的人数 student stus[1010];scanf("%d",&n1);long long no;int sit,test;for(int i0;i<n1;i){s…

Premiere制作VCD视频几个关键设置

一&#xff0c;视频设置 1&#xff0c;编码设置&#xff1a;不要选cinepak codec by radius,这个编码速度非常慢,图象也不清晰,一般只在电脑多多媒体交互式演示文件中使用。很多朋友遇到的“速度慢”、“不清晰”&#xff0c;多半是这里设置不合适造成。 2&#xff0c;帧尺寸&a…

qt中定时器Timer的使用

转载于:https://www.cnblogs.com/zhouwenJS/p/3762341.html

python基础===拆分字符串,和拼接字符串

给定某字符&#xff0c;只需要保留其中的有效汉字或者字母&#xff0c;数字之类的。去掉特殊符号或者以某种格式进行拆分的时候&#xff0c;就可以采用re.split的方法。例如 RESTART: Shell >>> s Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.19…

(C++)1036 跟奥巴马一起编程

#include<cstdio> //10列 共5行 131 //11列 共6行 141 //n%20 1n/2-21 //n%2!0 1(n-1)/2-11 int main(){int col,mid;char c;scanf("%d %c",&col,&c);//第一行for(int i 0;i<col;i){printf("%c",c);} printf("\n");//中间行/…

使用LINQ进行多表操作(二)

1:M或者M:M关系的多表操作表结构如下直接写表达式 //正常选取var user context.Users.Where(p >p.UserID 10300).Select(p >new{p, p.UserTags})//带条件选取var user context.Users.Where(p >p.UserID 10300).Select(p >new{p, UserTags p.UserTags.Where(o >…

分布式文件系统

PDF格式PPT下载&#xff1a;分布式文件系统 转载于:https://www.cnblogs.com/mfrbuaa/p/3765902.html

Codis 3.2 集群搭建与测试

这里首选分为四个步骤进行一、软件下载codis 3.2.2 https://github.com/CodisLabs/codis/releasescodis-src https://codeload.github.com/CodisLabs/codis/zip/release3.2zeepkeeper 3.5.4 http://ftp.twaren.net/Unix/Web/apache/zookeeper/zookeeper-3.5.4-beta/zookeeper…

(C++)CSP202009-1 称检测点查询

#include<cstdio> #include<cmath> #define MAXSIZE 200//定义结构体 struct sqList{int r[MAXSIZE1][2];int length0; }; //交换 void swap(sqList* sqz,int index1,int index2){int temp sqz->r[index1][1];sqz->r[index1][1]sqz->r[index2][1];sqz-&…

sysbench的安装和做性能测试

sysbench的安装和做性能测试 http://imysql.cn/node/312 sysbench是一个模块化的、跨平台、多线程基准测试工具&#xff0c;主要用于评估测试各种不同系统参数下的数据库负载情况。 关于这个项目的详细介绍请看&#xff1a;http://sysbench.sourceforge.net。 它主要包括以下几…

React文档 state and lifecycle

状态和生命周期 这篇介绍 React 组件中状态和声明周期的概念。详情可以查看API参考 。 思考前一部分中时钟的例子。渲染元素中&#xff0c;我们仅学习了一种更新 UI 的方式。调用 ReactDOM.render() 改变渲染后的输出。 function tick() {const element (<div><h1>…

【讨论】基于WF的流程结构

大家都知道&#xff0c;在WF中默认情况下&#xff0c;其活动是以树状结构组成的&#xff0c;简单说就是复合活动包含其子活动&#xff0c;如果子活动也是复合活动也可以包含其子活动&#xff0c;但同一个活动不能成为两个活动的子活动。这种方式被大量使用在WF自带的活动库中&a…

(C++)设计一个程序能计算一个日期加上若干天后是什么日期and计算日期差值

输入第一行表示样例个数m&#xff0c;接下来m行每行四个整数分别表示年月日和累加的天数。 输出m行&#xff0c;每行按yyyy-mm-dd的个数输出。 #include<cstdio>//判断是否是闰年 bool isLeap(int year){return (year%40&&year%100!0)||year%4000; }//用二维数…

【转载】解决Apache2+PHP上传文件大小限制的问题

原文出处&#xff1a;http://evol1216.blog.163.com/blog/static/13019958020106783623528/ 在用PHP进行文件上传的操作中&#xff0c;需要知道怎么控制上传文件大小的设置&#xff0c;而文件可传大小是受到多种因素制约的&#xff0c;现总结如下&#xff1a; 1、php.ini:uploa…

第36章 网络管理

第36章 网络管理 监听 11g的话首先写配置文件vi /u01/grid/11g/network/admin/listener.ora打开后选取下面的两个部分修改就好了 模板所在地vi /u01/11g/network/admin/samples/listener.ora SID_LIST_LISTENER (SID_LIST (SID_DESC (GLOBAL_DNAMEwyzc11g) (SID_NAMEwyzc11g)…

(C++)CSP202006-2 稀疏向量 two pointers

#include<cstdio>const int M 500000;//a,b<5*10^5 int u[M1][2];//第一维是index,第二维是value int v[M1][2];int main(){//1.读入n,a,b//2.对数组进行遍历&#xff0c;如果第一位相等&#xff0c;将第二维相乘 int n,a,b,i;long long ans0;scanf("%d%d%d&qu…

基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库01 —— 准备环境,搭建本地仓库,安装ambari...

一、集群软硬件环境准备&#xff1a; 操作系统&#xff1a; centos 7 x86_64.1804 Ambari版本&#xff1a;2.7.0 HDP版本&#xff1a;3.0.0 HAWQ版本&#xff1a;2.3.05台PC作为工作站&#xff1a; ep-bd01ep-bd02ep-bd03ep-bd04ep-bd05其中ep-bd01作为主节点&#xff0c;用于…

PDF编辑工具——PDF Desktop Converter 4 Professional

管理和操作PDF的工具。PDF Desktop Converter 4 Professional可以生成&#xff0c;转换&#xff0c;提取&#xff0c;组合&#xff0c;分割合并PDF。新增加的OCR功能可以将扫描后的文件转变成可以检索和编辑的PDF。以上这些功能只需要一个软件就可以全部实现。软件特点1. 快速&…

史上世界上最惨烈的几次股灾!

史上世界上最惨烈的几次股灾&#xff01;●最惨烈的几次股灾 1美国股灾 1.1 1929年大股灾 1929年10月24日&#xff0c;星 期四。灾难的发生是毫无征兆的&#xff0c;开盘时&#xff0c;并没有出现什么值得注意的迹象&#xff0c;而且有一段时间股指还非常坚挺&#xff0c;但交易…

(C++) CSP 201803-1 跳一跳

#include<cstdio> const int M 30; int a[M1][2];//第一维用于读入&#xff0c;第二维用于记录上一局得分 int main(){int temp,index0,ans0;scanf("%d",&temp);while(temp!0){a[index][0]temp;if(a[index][0]1){ans1;}else{if(a[index-1][0]2){a[index][…

C#对象数组排序方法

一个排序的类&#xff0c;用了几种方式实现的。 usingSystem; namespaceDataStruct { publicclassSorter { ///<summary>///冒泡排序法1 ///</summary>/*&#xff08;1&#xff09;对于数组list中的1至n个数据&#xff0c;先将第1个和第2个数据进行比…

Asp.net MVC 3 防止 Cross-Site Request Forgery (CSRF)原理及扩展 安全 注入

原理&#xff1a;http://blog.csdn.net/cpytiger/article/details/8781457 原文地址&#xff1a;http://www.cnblogs.com/wintersun/archive/2011/12/09/2282675.html Cross-Site Request Forgery (CSRF) 是我们Web站点中常见的安全隐患。 下面我们在Asp.net MVC3 来演示一下。…

Windows下安装Redis服务

2019独角兽企业重金招聘Python工程师标准>>> Redis是有名的NoSql数据库&#xff0c;一般Linux都会默认支持。但在Windows环境中&#xff0c;可能需要手动安装设置才能有效使用。这里就简单介绍一下Windows下Redis服务的安装方法&#xff0c;希望能够帮到你。 1、要安…

(C++)1022 D进制的A+B 除基取余法将10进制数换成给定进制数

#include<cstdio> //除基取余法 const int M 30;int main(){long long a,b,c;int D,ans[M2];scanf("%lld%lld%d",&a,&b,&D);cab;int num0;do{ans[num]c%D;c c/D;}while(c!0);for(int inum-1;i>0;i--){printf("%d",ans[i]);}return…