軟體架構不一定是龐大的,但一定是清晰的。
清晰的軟體架構,執行期從系統的第一聲心跳開始,核心歷經一連串狀態改變的過程,稱之為系統生命週期。生命週期的重要性,在於核心控管狀態與事件依序執行。
系統的心跳,以雙重檢查鎖定進行延遲初始化以取得獨身模式下的唯一實體。
private Heartbeat()
{
this.Stage = KernelStage.Stopped;
foreach(Assembly asm in Reflector.Assemblies) {
List<Type> types = Reflector.GatherByInterface<IStart>(asm);
foreach(Type type in types) {
IStart start = Reflector.CreateInstance(type) as IStart;
if(null == start) { continue; }
Attach(start);
}
}
}
這部分實作內容,請參閱程式
.Kuick\Kernel\Heartbeat.cs
.Kuick\Kernel\Platform.cs
.Kuick\Kernel\Start.cs
.Kuick\Enum\KernelStage
.Kuick\Interface\IStart.cs
.Kuick.Data\Misc\DataStart.cs
相關名詞解釋,請參考 Wikipedia
.雙重檢查鎖定 Double-checked locking
.延遲初始化 Lazy initialization
.獨身模式 Singleton pattern
系統取得唯一的 Heartbeat 實體時,在 Heartbeat 建構式裡掃描系統內所有的組件,收集所有實作 IStart 介面的類別,附加到 Heartbeat 事件處理器裡。
foreach(Assembly asm in Reflector.Assemblies) {
List<Type> types = Reflector.GatherByInterface<IStart>(asm);
foreach(Type type in types) {
IStart start = Reflector.CreateInstance(type) as IStart;
if(null == start) { continue; }
Attach(start);
}
}
Kuick 內建 2 個實作 IStart 介面的類別。
1. Kuick.Start
是 Kuick Application Framework 的內建啟動器
2. Kuick.Data.DataStart
是 Kuick ORM Framework 的內建啟動器
系統啟動過程依序觸發執行 7 個事件
1. 系統啟動前 PreStart
Kuick.Start:
建立 setting 與 log 資料夾,並對 Logger 進行初始化,
載入實作 IEvent 介面的事件定義類別,產生實體並在 EventCache 裡實現快取。
載入實作 IError 介面的錯誤定義類別,產生實體並在 ErrorCache 裡實現快取。
Kuick.Data.DataStart:
無。
2. 啟動內建功能 BuiltinStart
Kuick.Start:
載入實作 IBuiltin 介面的類別,產生實體並向 Builtins 註冊。
Kuick.Data.DataStart:
無。
3. 啟動外掛功能 PluginStart
Kuick.Start:
載入實作 IPlugin 介面的類別,產生實體並向 Plugins 註冊。
Kuick.Data.DataStart:
無。
4. 資料庫啟動前 PreDatabaseStart
Kuick.Start:
無。
Kuick.Data.DataStart:
載入實作 IEntity 介面的 Entity 類別,產生實體並在 EntityCache 裡實現快取。
自設定檔取出資料庫連線設定,產生實體 DbSetting 並在 DbSettingCache 裡實現快取。
載入有設定 DatabaseAttribute 的類別,產生實體並向 DbCache 註冊。
5. 啟動資料庫 DatabaseStart
Kuick.Start:
無。
Kuick.Data.DataStart:
進行資料庫規格初始化
6. 資料庫啟動後 PostDatabaseStart
Kuick.Start:
無。
Kuick.Data.DataStart:
無。
7. 系統啟動後 PostStart
Kuick.Start:
載入實作 IInitializer 介面的類別,產生實體並執行 Initiate 方法。
Kuick.Data.DataStart:
無。
系統停止過程依序觸發執行 3 個事件
1. 停止外掛功能 PluginTerminate
Kuick.Start:
從 Plugins 缷載外掛
Kuick.Data.DataStart:
無。
2. 停止內建功能 BuiltinTerminate
Kuick.Start:
從 Builtins 缷載內建
Kuick.Data.DataStart:
無。
3. 系統停止後 PostTerminate
Kuick.Start:
終結 Logger。
Kuick.Data.DataStart:
無。
如何在系統啟動與停止過程裡,為專案加上客制化處理?
所有實作 Kuick.IStart 介面的類別,皆會在 Heartbeat 實體產生時自動載入,專案客制可以仿照 Kuick.Start 或是 Kuick.Data.DataStart 的實作方式處理。
========================================
鐵人賽分享列表:Kuick Application & ORM Framework
開放原始碼專案:kuick.codeplex.com
直接下載原始碼:Kuick
下載相關文件檔:C# Code Conventions and Design Guideline
相關教學影片區:Kuick on YouTube