MongoDB管理工具的插件系统
MongoDB管理工具 MongoCola的开发已经进入第三个年头了。
官方对于C#驱动的投入不够导致了很多东西都必须自己实现,但是不管怎么样,工具现在已经很强大了。
最近准备着手插件系统的开发,简单的插件系统,其实代码量非常的少。
1.插件基类
插件系统需要一个插件基类的支持,这个基类,规定了一个插件所包含的固有字段,例如插件名称,插件说明,插件作者等等。
同时,还定义了主方法的名称,毕竟插件系统肯定要使用反射来完成,所以很多东西必须要统一起来。
using System; namespace MagicMongoDBTool.Common
{
public abstract class PlugBase
{
/// <summary>
/// 路径阶层[考虑到以后可能阶层会变换]
/// </summary>
public enum PathLv : int
{
/// <summary>
/// 连接/服务器
/// </summary>
ConnectionLV = ,
/// <summary>
/// 具体的实例
/// </summary>
InstanceLV = ,
/// <summary>
/// 数据库
/// </summary>
DatabaseLV = ,
/// <summary>
/// 数据集
/// </summary>
CollectionLV = ,
/// <summary>
/// 数据文档
/// </summary>
DocumentLV = ,
/// <summary>
/// 杂项
/// </summary>
Misc =
}
/// <summary>
/// 插件菜单表示名称
/// </summary>
public string PlugName = String.Empty;
/// <summary>
/// 插件功能简述
/// </summary>
public string PlugFunction = String.Empty;
/// <summary>
/// 处理对象
/// </summary>
public dynamic PlugObj;
/// <summary>
/// 对象层次
/// </summary>
public PathLv RunLv = PathLv.ConnectionLV;
/// <summary>
/// 运行
/// </summary>
/// <returns></returns>
public abstract int Run();
}
}
Run是个抽象方法,既然是抽象方法,继承这个类的插件都必须实现这个方法。Run也是以后工具调用插件功能的入口函数。
这个基类,可以以源代码的形式添加到插件的工程里面,当然,也可以做成一个DLL,让插件的工程引用。我现在讲它做成了DLL。
2.工具如何发现插件
做法也很简单,所有的插件的DLL统一放在指定目录中,然后使用强大的反射,获取插件的基本情报,放在字典里面
using MagicMongoDBTool.Common;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Windows.Forms;
namespace MagicMongoDBTool.Module
{
public class PlugIn
{
public static Dictionary<String, PlugBase> PlugInList = new Dictionary<string, PlugBase>();
/// <summary>
/// 加载到菜单项目
/// </summary>
public static void LoadPlugIn()
{
///注意
///必须将Common.DLL放在Bin下面!
foreach (var mFile in System.IO.Directory.GetFiles(Application.StartupPath + @"\PlugIn\","*.dll"))
{
try
{
Assembly mAssem = Assembly.LoadFile(mFile);
String FileName = mFile.Replace(Application.StartupPath + @"\PlugIn\", String.Empty);
if (FileName == "MagicMongoDBTool.Common.dll") continue;
String TypeName = FileName.Substring(, FileName.Length - );
Type mType = mAssem.GetType(TypeName + "." + TypeName);
ConstructorInfo ConstructorInfo = mType.GetConstructor(new System.Type[] {});
PlugBase mPlug = (PlugBase)ConstructorInfo.Invoke(new object[] { });
PlugInList.Add(TypeName, mPlug);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
}
}
}
}
这里需要注意一个问题,由于插件使用了插件基类PlugBase,PlugBase是放在一个独立的DLL中的,所以,请将这个DLL放在可执行文件的同一目录下面。
理由是,反射执行的时候,需要访问PlugBase基类的构造。(可能是这样吧)
3.将插件展示在菜单里面
PlugIn.LoadPlugIn();
foreach (var plugin in PlugIn.PlugInList)
{
ToolStripItem menu = new ToolStripMenuItem(plugin.Value.PlugName);
menu.ToolTipText = plugin.Value.PlugFunction;
menu.Tag = plugin.Key;
menu.Click += new EventHandler(
(x, y) =>
{
RunPlugIn(plugin.Key);
}
);
this.plugInToolStripMenuItem.DropDownItems.Add(menu);
}
就是一个很简单的动态创建菜单
4.运行插件
/// <summary>
/// 运行插件
/// </summary>
/// <param name="PlugInKeyCode"></param>
private void RunPlugIn(string PlugInKeyCode)
{
System.Reflection.Assembly mAssem = Assembly.LoadFile(Application.StartupPath + @"\PlugIn\" + PlugInKeyCode + ".dll");
String TypeName = PlugInKeyCode;
Type mType = mAssem.GetType(TypeName + "." + TypeName);
ConstructorInfo ConstructorInfo = mType.GetConstructor(new System.Type[] { });
PlugBase mPlug = (PlugBase)ConstructorInfo.Invoke(new object[] { });
switch (PlugIn.PlugInList[PlugInKeyCode].RunLv)
{
case MagicMongoDBTool.Common.PlugBase.PathLv.ConnectionLV:
mPlug.PlugObj = SystemManager.GetCurrentServer();
break;
case MagicMongoDBTool.Common.PlugBase.PathLv.InstanceLV:
mPlug.PlugObj = SystemManager.GetCurrentServer();
break;
case MagicMongoDBTool.Common.PlugBase.PathLv.DatabaseLV:
mPlug.PlugObj = SystemManager.GetCurrentDataBase();
break;
case MagicMongoDBTool.Common.PlugBase.PathLv.CollectionLV:
mPlug.PlugObj = SystemManager.GetCurrentCollection();
break;
case MagicMongoDBTool.Common.PlugBase.PathLv.DocumentLV:
break;
default:
break;
}
mPlug.Run();
}
采用反射运行插件,没有什么技术含量。
5.简单的做了一个Sample,学过MongoDB的,自然看得懂了
using MagicMongoDBTool.Common;
using MongoDB.Driver;
using System.Windows.Forms;
namespace ExportToExcel
{
public class ExportToExcel:PlugBase
{
/// <summary>
/// 内部变量
/// </summary>
MongoCollection ProcessCollection;
/// <summary>
/// 初始化设定
/// </summary>
public ExportToExcel()
{
base.RunLv = PathLv.CollectionLV;
base.PlugName = "导出到Excel工具";
base.PlugFunction = "将数据集导出到Excel";
}
/// <summary>
/// 运行
/// </summary>
/// <returns></returns>
public override int Run()
{
ProcessCollection = base.PlugObj;
MessageBox.Show(ProcessCollection.Name);
return ;
}
}
}
园子里面使用MongoDB的朋友不是很多,我想找个朋友一起来继续开发这个工具。或者找人帮我开发一些插件。
中国的开源项目,期初很热闹,但是过一段时间,就冷清了。我想找的开发伙伴,希望能耐得住寂寞,能够长期保持开发热情。
人不需要太多,1个2个就可以了。
工具官方网址
GitHub
https://github.com/magicdict/MagicMongoDBTool
MongoDB管理工具的插件系统的更多相关文章
- mongodb管理工具rockmongo
mongodb的图像管理工具非常之多,我用的是rockmongo. RockMongo 是一个PHP5写的MongoDB管理工具. 主要特征: 使用宽松的New BSD License协议 速度快,安 ...
- MongoDB.WebIDE:升级版的Mongodb管理工具
很早以前收藏了一片文章:<强大的MongoDB数据库管理工具>.最近刚好要做一些MongoDB方面的工作,于是翻出来温习了一下,用起来也确实挺方便.不过在使用过程中出现了一些个问题,加上更 ...
- elasticsearch集群管理工具head插件(转)
elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序,你可以通过插件把它集成到es 插件安装方法1: 1.elasticsearc ...
- Elasticsearch集群管理工具head插件安装
Elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序,你可以通过插件把它集成到es.或直接下载源码,在本地打开index.html ...
- MongoDB 管理工具:Robomongo
http://www.open-open.com/lib/view/open1383029577546.html
- MongoDB图形化管理工具
NoSQL的运动不止,MongoDB 作为其中的主力军发展迅猛,也带起了一股开发图形化工具的风潮:气死反过来说,看一个产品是否得到认可,可以侧面看其第三方工具的数量和成熟程度:简单的收集了MongoD ...
- MongoDB安装、管理工具、操作
1. mongoDB安装.启动.关闭 1.1 下载安装包 wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.3.tgz 1.2 ...
- MongoDB的php可视化管理工具
使用MongoDB命令查看很不方便 于是想把爬来的数据导出来,看爬来的数据是否正确 打开cmd,执行 mongoexport -d test -c blogs --csv -f title,link, ...
- MongoDB 生态 – 可视化管理工具
工欲善其事,必先利其器,我们在使用数据库时,通常需要各种工具的支持来提高效率:很多新用户在刚接触 MongoDB 时,遇到的问题是『不知道有哪些现成的工具可以使用』,本系列文章将主要介绍 MongoD ...
随机推荐
- Atitit 代理与分销系统(1) 子代理 充值总额功能设计概览 sum() groubpy subagt
Atitit 代理与分销系统(1) 子代理 充值总额功能设计概览 sum() groubpy subagt Keyword 分组与聚合操作. 一个for做分组...里面的做聚合... 数据g操作查 ...
- 在jQuery ajax中按钮button和submit的区别分析
在使用jQuery ajax的get方法进行页面传值,不能用submit,否则无刷新获取数据展示 点击submit提交按钮,sendPwd.php通过$_POST接收传过来的值,然后echo一段数据. ...
- 每天一个linux命令(21):find命令之xargs
在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行.但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出 ...
- javascript_core_09之继承、属性、对象
1.OOP之修改继承: ①child._proto_=father:=>Object.setPrototypeOf(child,father):每次只能修改一个对象的父对象: ②构造函数.pro ...
- C# 进制转换 (没有数值的长度限制)
曾经在大学时做过一个c的进制转换算法,那时由于技术的局限性,数值的大小受到限制(系统数据类型长度限制),多年以后,自己那台学习机陈旧后感觉要报废了,整理了一下里面的东西,偶尔在一个角落里发现了这个转换 ...
- Winform实现Shp-栅格图形文件的读取与显示(外加shp转WKB格式存入oracle)附源码
前言:上学期GIS空间数据库课程设计时,老师让实现Shp-栅格图形文件的读取与显示,外加shp转WKB格式存入oracle,不使用第三方类库,花了一天时间在网上找了一些资料,实现了一个简单的栅格图形文 ...
- SQL*Loader之CASE9
CASE9 1. SQL脚本 [oracle@node3 ulcase]$ cat ulcase9.sql set termout off rem host write sys$output &quo ...
- Visual Studio 选择相同变量高亮
前段时间一直在使用matlab,今天需要使用vs2008,而用惯了matlab,习惯了其中一项选中变量高亮的设置,突然回来使用VS,感到各种不适应,顿时想到了一个词:矫情 呵呵,于是在网上找各种插件, ...
- (转)JS模块化编程之AMD规范
模块的规范 原文地址 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有 ...
- Android如何避免切换至SurfaceView时闪屏(黑屏闪一下)以及黑屏移动问题
1.最近的项目中,有一个Activity用到Fragment+ViewPager,其中一个fragment中实现了视频播放的功能,包含有SurfaceView.结果,每次打开程序第一次进入到该Acti ...