例:製品モジュールのコンポーネント構築
8125 ワード
考え方:ダイナミックロードモジュールDLL
プロセス:
1、モジュールインタフェースの定義
2、モジュールインタフェースを実現する
3、プロファイル構成モジュールパス
4、製品Appロードモジュール
モジュールインタフェース
モジュール実装インタフェース
コンポーネントのプロパティの定義
コンポーネントセットの登録
モジュールが登録されているかどうかを確認するプロファイルの登録
製品Appロードモジュール
グローバル構成情報
初期化モジュール製品構成パス(主にbinディレクトリ、Configeディレクトリ、ログを含む)
プロファイルモジュール情報のロード
登録モジュールメソッドのロード
プロセス:
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