例:製品モジュールのコンポーネント構築

8125 ワード

考え方:ダイナミックロードモジュールDLL
プロセス:
1、モジュールインタフェースの定義
2、モジュールインタフェースを実現する
3、プロファイル構成モジュールパス
4、製品Appロードモジュール
モジュールインタフェース
    public interface IModules
    {
        IEnumerable GetModules();
    }

モジュール実装インタフェース
    public class Modules : IModules
    {
          public IEnumerable GetModules()
        {
            List modules = new List();
            modules.Add(new MyModule());
            return modules;
        }
    }

コンポーネントのプロパティの定義
    [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = false)]
    public class ModulesAttribute : Attribute
    {
        public ModulesAttribute(Type type);

        public IModules GetModules();
    }

コンポーネントセットの登録
[assembly: ModulesAttribute(typeof(Modules))]

モジュールが登録されているかどうかを確認するプロファイルの登録
      MyModule" dll="MyModule.dll" />

製品Appロードモジュール
グローバル構成情報
    ///           
    public interface ISystemPath
    {
        string HeBianGuDocuments { get; }

        ///  bin     
        string BinPath { get; }

        ///           
        string ConfigPath { get; }
        string GlobalConfigPath { get; }

        string CultureConfigPath { get; }

        string ProjectsPath { get; }

        ///             
        string RegistriesConfigPath { get; set; }

        string ModulesDllPath { get; set; }

        string ApplicationsConfigPath { get; set; }
    }

初期化モジュール製品構成パス(主にbinディレクトリ、Configeディレクトリ、ログを含む)
        ///         
        void InitResource()
        {
            string exeFileFullPath = Assembly.GetEntryAssembly().Location;
            string exeName = Path.GetFileNameWithoutExtension(exeFileFullPath);
            string binPath = Path.GetDirectoryName(exeFileFullPath);

            //         
            HeSystemInfo.Instance.Init(binPath);
            string configFilePath = Path.Combine(HeSystemInfo.Instance.SystemPath.CultureConfigPath, "Applications", "TestApp", "StringResource.xml");

            //         
            StringResource.Init(configFilePath);

            string logFilePath = Path.GetDirectoryName(binPath);
            //       
            Output.InitLogger(logFilePath, System.Diagnostics.Process.GetCurrentProcess().ProcessName);

            //       
            _moduleInstances = new ModuleInstanceCenter(this);
        }

プロファイルモジュール情報のロード
 ///       
        void InitConfigerModules()
        {
            //        
            string binPath = AppDomain.CurrentDomain.BaseDirectory;

            //         
            string exeFileFullPath = Assembly.GetEntryAssembly().Location;

            string exeName = Path.GetFileNameWithoutExtension(exeFileFullPath);

            _applicationInfo = new ApplicationInfo(exeName);

            //       
            string appConfigPath = System.IO.Path.Combine(HeSystemInfo.Instance.SystemPath.CultureConfigPath, "Applications", exeName);

            if (File.Exists(System.IO.Path.Combine(appConfigPath + @"\" + exeName + @".ico")))
                this.Icon = new Icon(System.IO.Path.Combine(appConfigPath + @"\" + exeName + @".ico"));
            else
                this.Icon = Resources.defalt;

            //       
            List ids = new List();

            foreach (IHeFunctionModule module in _applicationInfo.Modules)
            {
                if (ids.IndexOf(module.ID) < 0)

                    ids.Add(module.ID);
            }

            InitMenu();

            //this.proInfo.labelControl8.Text = string.Format("[{0}{1}]", appName, AppLogic.Instance.Rs.TextByID(StringID.ProjectInfo));

            //        
            //SetFormTitle();

            //         
            //InitGrid();


        }

登録モジュールメソッドのロード
 class ApplicationInfo : IHeApplicationInfo
    {
        List _modules = new List();
        public List Modules
        {
            get { return _modules; }
        }

        public ApplicationInfo(string appID)
        {
            _id = appID;

            InitApplicationConfig();

        }

        public void InitApplicationConfig()
        {
            string appConfigPath = HeSystemInfo.Instance.Regisries.GetApplicationConfigPath(_id);

            _configPath = appConfigPath;

            string configFilePath = Path.Combine(appConfigPath, "Config.xml");

            XmlDocument doc = new XmlDocument();
            doc.Load(configFilePath);
            XmlElement applicationInfoNode = doc.DocumentElement.SelectSingleNode("ApplicationInfo") as XmlElement;

          _modules.Clear();
          XmlElement modulesNode = doc.DocumentElement.SelectSingleNode("Modules") as XmlElement;

            XmlNodeList nodes = modulesNode.ChildNodes;

            IHeFunctionModule module = null;

            foreach (XmlElement one in nodes)
            {
                string viStr = one.GetAttribute("visible");
                bool visible = true;

                if (!string.IsNullOrWhiteSpace(viStr)) visible = bool.Parse(viStr);

                if (!visible) continue;

                string moduleID = one.GetAttribute("id");

                int i = 0;

                bool find = false;

                if (!find)
                {
                    if (moduleID.ToUpper() == "EXE" || moduleID.ToUpper() == "URL")
                    {
                        //module = new ThirdModule(moduleID, one.GetAttribute("path"), one.GetAttribute("arg"));
                    }
                    else
                    {
                        module = HeModulesManager.Instance.GetFunctionModule(moduleID);
                    }

                    if (module == null) continue;

                    _modules.Add(module);

                    i = _modules.Count - 1;

                }
              
            }
    }


public class HeModulesManager
    {
        public IHeFunctionModule GetFunctionModule(string id)
        {
            HeModulePath modulePath = HeSystemInfo.Instance.Regisries.GetModulePath(id);

            if (modulePath == null)
                return null;

            try
            {
                Assembly ass = Assembly.LoadFile(modulePath.DllFilePath);

                object[] objs = ass.GetCustomAttributes(typeof(HeModulesAttribute), false);

                IHeModules modules = (objs[0] as HeModulesAttribute).GetModules();

                return modules.GetModule(id, HeModuleType.FuncionModule) as IHeFunctionModule;

            }
            catch (System.Exception e)
            {
                return null;
            }

        }

        static HeModulesManager s_instance = new HeModulesManager();

        public static HeModulesManager Instance { get { return s_instance; } }
    }
}


: https://github.com/HeBianGu/ProductWork.git