iT邦幫忙

DAY 4
1

Kuick Application & ORM Framework系列 第 4

Kuick -- 你聽得到系統的心跳聲嗎?

軟體架構不一定是龐大的,但一定是清晰的。
清晰的軟體架構,執行期從系統的第一聲心跳開始,核心歷經一連串狀態改變的過程,稱之為系統生命週期。生命週期的重要性,在於核心控管狀態與事件依序執行。

系統的心跳,以雙重檢查鎖定進行延遲初始化以取得獨身模式下的唯一實體。

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


上一篇
Kuick -- C# 代碼規範和設計指引
下一篇
Kuick -- 啟動系統生命週期
系列文
Kuick Application & ORM Framework34

尚未有邦友留言

立即登入留言