MongoDB管理工具  MongoCola的开发已经进入第三个年头了。

官方对于C#驱动的投入不够导致了很多东西都必须自己实现,但是不管怎么样,工具现在已经很强大了。

最近准备着手插件系统的开发,简单的插件系统,其实代码量非常的少。

1.插件基类

插件系统需要一个插件基类的支持,这个基类,规定了一个插件所包含的固有字段,例如插件名称,插件说明,插件作者等等。

同时,还定义了主方法的名称,毕竟插件系统肯定要使用反射来完成,所以很多东西必须要统一起来。

  1. using System;
  2.  
  3. namespace MagicMongoDBTool.Common
  4. {
  5. public abstract class PlugBase
  6. {
  7. /// <summary>
  8. /// 路径阶层[考虑到以后可能阶层会变换]
  9. /// </summary>
  10. public enum PathLv : int
  11. {
  12. /// <summary>
  13. /// 连接/服务器
  14. /// </summary>
  15. ConnectionLV = ,
  16. /// <summary>
  17. /// 具体的实例
  18. /// </summary>
  19. InstanceLV = ,
  20. /// <summary>
  21. /// 数据库
  22. /// </summary>
  23. DatabaseLV = ,
  24. /// <summary>
  25. /// 数据集
  26. /// </summary>
  27. CollectionLV = ,
  28. /// <summary>
  29. /// 数据文档
  30. /// </summary>
  31. DocumentLV = ,
  32. /// <summary>
  33. /// 杂项
  34. /// </summary>
  35. Misc =
  36. }
  37. /// <summary>
  38. /// 插件菜单表示名称
  39. /// </summary>
  40. public string PlugName = String.Empty;
  41. /// <summary>
  42. /// 插件功能简述
  43. /// </summary>
  44. public string PlugFunction = String.Empty;
  45. /// <summary>
  46. /// 处理对象
  47. /// </summary>
  48. public dynamic PlugObj;
  49. /// <summary>
  50. /// 对象层次
  51. /// </summary>
  52. public PathLv RunLv = PathLv.ConnectionLV;
  53. /// <summary>
  54. /// 运行
  55. /// </summary>
  56. /// <returns></returns>
  57. public abstract int Run();
  58. }
  59. }

Run是个抽象方法,既然是抽象方法,继承这个类的插件都必须实现这个方法。Run也是以后工具调用插件功能的入口函数。

这个基类,可以以源代码的形式添加到插件的工程里面,当然,也可以做成一个DLL,让插件的工程引用。我现在讲它做成了DLL。

2.工具如何发现插件

做法也很简单,所有的插件的DLL统一放在指定目录中,然后使用强大的反射,获取插件的基本情报,放在字典里面

  1. using MagicMongoDBTool.Common;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Reflection;
  5. using System.Windows.Forms;
  6. namespace MagicMongoDBTool.Module
  7. {
  8. public class PlugIn
  9. {
  10. public static Dictionary<String, PlugBase> PlugInList = new Dictionary<string, PlugBase>();
  11. /// <summary>
  12. /// 加载到菜单项目
  13. /// </summary>
  14. public static void LoadPlugIn()
  15. {
  16. ///注意
  17. ///必须将Common.DLL放在Bin下面!
  18. foreach (var mFile in System.IO.Directory.GetFiles(Application.StartupPath + @"\PlugIn\","*.dll"))
  19. {
  20. try
  21. {
  22. Assembly mAssem = Assembly.LoadFile(mFile);
  23. String FileName = mFile.Replace(Application.StartupPath + @"\PlugIn\", String.Empty);
  24. if (FileName == "MagicMongoDBTool.Common.dll") continue;
  25. String TypeName = FileName.Substring(, FileName.Length - );
  26. Type mType = mAssem.GetType(TypeName + "." + TypeName);
  27. ConstructorInfo ConstructorInfo = mType.GetConstructor(new System.Type[] {});
  28. PlugBase mPlug = (PlugBase)ConstructorInfo.Invoke(new object[] { });
  29. PlugInList.Add(TypeName, mPlug);
  30. }
  31. catch (Exception ex)
  32. {
  33. System.Diagnostics.Debug.WriteLine(ex.ToString());
  34. }
  35. }
  36. }
  37. }
  38. }

这里需要注意一个问题,由于插件使用了插件基类PlugBase,PlugBase是放在一个独立的DLL中的,所以,请将这个DLL放在可执行文件的同一目录下面。

理由是,反射执行的时候,需要访问PlugBase基类的构造。(可能是这样吧)

3.将插件展示在菜单里面

  1. PlugIn.LoadPlugIn();
  2. foreach (var plugin in PlugIn.PlugInList)
  3. {
  4. ToolStripItem menu = new ToolStripMenuItem(plugin.Value.PlugName);
  5. menu.ToolTipText = plugin.Value.PlugFunction;
  6. menu.Tag = plugin.Key;
  7. menu.Click += new EventHandler(
  8. (x, y) =>
  9. {
  10. RunPlugIn(plugin.Key);
  11. }
  12. );
  13. this.plugInToolStripMenuItem.DropDownItems.Add(menu);
  14. }

就是一个很简单的动态创建菜单

4.运行插件

  1. /// <summary>
  2. /// 运行插件
  3. /// </summary>
  4. /// <param name="PlugInKeyCode"></param>
  5. private void RunPlugIn(string PlugInKeyCode)
  6. {
  7. System.Reflection.Assembly mAssem = Assembly.LoadFile(Application.StartupPath + @"\PlugIn\" + PlugInKeyCode + ".dll");
  8. String TypeName = PlugInKeyCode;
  9. Type mType = mAssem.GetType(TypeName + "." + TypeName);
  10. ConstructorInfo ConstructorInfo = mType.GetConstructor(new System.Type[] { });
  11. PlugBase mPlug = (PlugBase)ConstructorInfo.Invoke(new object[] { });
  12. switch (PlugIn.PlugInList[PlugInKeyCode].RunLv)
  13. {
  14. case MagicMongoDBTool.Common.PlugBase.PathLv.ConnectionLV:
  15. mPlug.PlugObj = SystemManager.GetCurrentServer();
  16. break;
  17. case MagicMongoDBTool.Common.PlugBase.PathLv.InstanceLV:
  18. mPlug.PlugObj = SystemManager.GetCurrentServer();
  19. break;
  20. case MagicMongoDBTool.Common.PlugBase.PathLv.DatabaseLV:
  21. mPlug.PlugObj = SystemManager.GetCurrentDataBase();
  22. break;
  23. case MagicMongoDBTool.Common.PlugBase.PathLv.CollectionLV:
  24. mPlug.PlugObj = SystemManager.GetCurrentCollection();
  25. break;
  26. case MagicMongoDBTool.Common.PlugBase.PathLv.DocumentLV:
  27. break;
  28. default:
  29. break;
  30. }
  31. mPlug.Run();
  32. }

采用反射运行插件,没有什么技术含量。

5.简单的做了一个Sample,学过MongoDB的,自然看得懂了

  1. using MagicMongoDBTool.Common;
  2. using MongoDB.Driver;
  3. using System.Windows.Forms;
  4. namespace ExportToExcel
  5. {
  6. public class ExportToExcel:PlugBase
  7. {
  8. /// <summary>
  9. /// 内部变量
  10. /// </summary>
  11. MongoCollection ProcessCollection;
  12. /// <summary>
  13. /// 初始化设定
  14. /// </summary>
  15. public ExportToExcel()
  16. {
  17. base.RunLv = PathLv.CollectionLV;
  18. base.PlugName = "导出到Excel工具";
  19. base.PlugFunction = "将数据集导出到Excel";
  20. }
  21. /// <summary>
  22. /// 运行
  23. /// </summary>
  24. /// <returns></returns>
  25. public override int Run()
  26. {
  27. ProcessCollection = base.PlugObj;
  28. MessageBox.Show(ProcessCollection.Name);
  29. return ;
  30. }
  31. }
  32. }

园子里面使用MongoDB的朋友不是很多,我想找个朋友一起来继续开发这个工具。或者找人帮我开发一些插件。

中国的开源项目,期初很热闹,但是过一段时间,就冷清了。我想找的开发伙伴,希望能耐得住寂寞,能够长期保持开发热情。

人不需要太多,1个2个就可以了。

工具官方网址

http://www.mywechatapp.com/

GitHub

https://github.com/magicdict/MagicMongoDBTool

MongoDB管理工具的插件系统的更多相关文章

  1. mongodb管理工具rockmongo

    mongodb的图像管理工具非常之多,我用的是rockmongo. RockMongo 是一个PHP5写的MongoDB管理工具. 主要特征: 使用宽松的New BSD License协议 速度快,安 ...

  2. MongoDB.WebIDE:升级版的Mongodb管理工具

    很早以前收藏了一片文章:<强大的MongoDB数据库管理工具>.最近刚好要做一些MongoDB方面的工作,于是翻出来温习了一下,用起来也确实挺方便.不过在使用过程中出现了一些个问题,加上更 ...

  3. elasticsearch集群管理工具head插件(转)

    elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序,你可以通过插件把它集成到es 插件安装方法1: 1.elasticsearc ...

  4. Elasticsearch集群管理工具head插件安装

    Elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序,你可以通过插件把它集成到es.或直接下载源码,在本地打开index.html ...

  5. MongoDB 管理工具:Robomongo

    http://www.open-open.com/lib/view/open1383029577546.html

  6. MongoDB图形化管理工具

    NoSQL的运动不止,MongoDB 作为其中的主力军发展迅猛,也带起了一股开发图形化工具的风潮:气死反过来说,看一个产品是否得到认可,可以侧面看其第三方工具的数量和成熟程度:简单的收集了MongoD ...

  7. MongoDB安装、管理工具、操作

    1. mongoDB安装.启动.关闭 1.1 下载安装包 wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.3.tgz 1.2 ...

  8. MongoDB的php可视化管理工具

    使用MongoDB命令查看很不方便 于是想把爬来的数据导出来,看爬来的数据是否正确 打开cmd,执行 mongoexport -d test -c blogs --csv -f title,link, ...

  9. MongoDB 生态 – 可视化管理工具

    工欲善其事,必先利其器,我们在使用数据库时,通常需要各种工具的支持来提高效率:很多新用户在刚接触 MongoDB 时,遇到的问题是『不知道有哪些现成的工具可以使用』,本系列文章将主要介绍 MongoD ...

随机推荐

  1. boost常用记录

    1.BOOST_FOREACH 经常会遍历容器,写for/while循环到手痛,使用BOOST_FOREACH可以减少我们的工作.支持容器vector/list/set/deque/stack/que ...

  2. iOS-数据持久化基础-沙盒机制

    沙盒详解 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文 ...

  3. Java-集合-第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum 表示学生的班号,例如“class05”。 有如下List List list = new ArrayList(); l

    第三题 有如下Student 对象, private String name; private int age; private int score; private String classNum; ...

  4. winform 程序制作自己的数字签名(续)

    在上一篇文章<winform 程序制作自己的数字签名>中我们已经可以得到我们程序定制的数字签名了,但是比较讨厌的是每次编译之后,数字签名需要重新手动添加. 我们需要的是在程序编译时自动添加 ...

  5. LinkedHashMap源码详解

    序言 本来是不打算先讲map的,但是随着对set集合的认识,发现如果不先搞懂各种map,是无法理解set的.因为set集合很多的底层就是用map来存储的.比如HashSet就是用HashMap,Lin ...

  6. OOCSS入门学习

    对于面向对象大家肯定都有多多少少的了解,这里所说的OOCSS就是说面向对象的CSS,得说明的是OOCSS并不是一门新语言也不是什么库,而是一种概念和javascript面向对象一样. 可能你这样写过C ...

  7. 提高 DHTML 页面性能

    联盟电脑摘要:本文说明了某些DHTML功能对性能的重大影响,并提供了一些提高DHTML页面性能的技巧. 目录 简介 成批处理DHTML更改 使用innerText 使用DOM添加单个元素 扩展SELE ...

  8. javascript类型系统——日期Date对象

    × 目录 [1]静态方法 [2]构造函数 [3]实例方法 前面的话 Date对象是javascript语言中内置的数据类型,用于提供日期和时间的操作接口.Date对象是在早期java中的java.ut ...

  9. CSS清浮动

    × 目录 [1]定义 [2]方法 [3]兼容 前面的话 人们经常谈起清浮动,其实就是解决浮动元素的包含块高度塌陷的问题 定义 clear 清除 值: left | right | both | non ...

  10. poj 3352Road Construction(无向双连通分量的分解)

    /* 题意:给定一个连通的无向图G,至少要添加几条边,才能使其变为强连通图(指的是边强联通). 思路:利用tarjan算法找出所有的双联通分量!然后根据low[]值的不同将双联通分量 进行缩点,最后图 ...