MongoDB 관리 도구의 플러그인 시스템

22669 단어 mongodb
MongoDB 관리 도구인 MongoCola의 개발은 3년째다.
공식적으로 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 = 0,
16             /// <summary>
17             ///      
18             /// </summary>
19             InstanceLV = 1,
20             /// <summary>
21             ///    
22             /// </summary>
23             DatabaseLV = 2,
24             /// <summary>
25             ///    
26             /// </summary>
27             CollectionLV = 3,
28             /// <summary>
29             ///     
30             /// </summary>
31             DocumentLV = 4,
32             /// <summary>
33             ///   
34             /// </summary>
35             Misc = 9
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을 지정된 디렉터리에 통일적으로 놓은 다음에 강력한 반사로 플러그인의 기본 정보를 얻어 사전에 넣는다
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(0, FileName.Length - 4);
                    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 0;
        }
    }
}

 
정원에 몬godb를 사용하는 친구가 많지 않아요. 친구를 찾아서 이 도구를 계속 개발하고 싶어요.아니면 플러그인 개발 좀 도와달라고.
중국의 개원 프로젝트는 초기에는 매우 떠들썩했지만 시간이 지나자 한산해졌다.내가 찾고 싶은 개발 파트너는 외로움을 견디고 장기적으로 개발 열정을 유지할 수 있기를 바란다.
사람이 많이 필요 없어요. 한 개에 두 개면 돼요.
 
도구 공식 사이트 주소
http://www.mywechatapp.com/
GitHub
https://github.com/magicdict/MagicMongoDBTool

좋은 웹페이지 즐겨찾기