// Author: Orlys // Github: https://github.com/Orlys namespace Yuuna.Contracts.Modules { using System; using System.Collections.Immutable; using System.Reflection; using System.Runtime.Loader; using Yuuna.Contracts.Optimization; using Yuuna.Contracts.Patterns; using Yuuna.Contracts.Semantics; using Yuuna.Contracts.TextSegmention; /// /// 模組狀態。 /// public enum ModuleStatus { /// /// 未初始化。 /// Uninitialized, /// /// 初始化失敗。 /// FailToInitialize, /// /// 初始化完成。 /// Initialized, } internal interface IModule { IPatternSet Patterns { get; } } public abstract class ModuleBase { protected virtual string ModuleName { get; } private readonly PatternFactory _patternfactory; internal IPatternSet Patterns => this._patternfactory; public ModuleBase() { this._patternfactory = new PatternFactory(this); this.ModuleName = this.GetType().Name; this.Status = ModuleStatus.Uninitialized; } /// /// 模組名稱。 /// public string Name { get { var t = this.GetType(); var getMethod = t.GetProperty(nameof(this.ModuleName), (BindingFlags)52).GetGetMethod(true); if (!getMethod.GetBaseDefinition().Equals(getMethod)) { try { var test = this.ModuleName; if (!string.IsNullOrWhiteSpace(test)) { return test; } } catch { } return t.Name; } else return this.ModuleName; } } /// /// 表示模組是否已初始化。 /// public ModuleStatus Status { get; private set; } /// /// 初始化模組 /// /// 分詞器 /// 群組管理 internal void Initialize(ITextSegmenter textSegmenter, IGroupManager groupManager) { if (this.Status.Equals(ModuleStatus.Uninitialized)) { try { this.BuildPatterns(groupManager, this._patternfactory); textSegmenter.Load(groupManager); this.Status = ModuleStatus.Initialized; this.AfterInitialize(); } catch //(Exception e) { this.Status = ModuleStatus.FailToInitialize; } } } /// /// 在初始化後引發。 /// protected virtual void AfterInitialize() { } /// /// 建立模式規則。 /// /// /// protected abstract void BuildPatterns(IGroupManager g, IPatternBuilder p); } }