iT邦幫忙

DAY 12
1

Kuick Application & ORM Framework系列 第 12

Kuick -- Data Initialize 資料初始化

資料初始化需求分成 2 種情況:
<一次性的資料建立>
一次性的需求來自於系統部署時,資料建立可以採取匯入資料庫備份檔,或是執行一段 Sql 指令達成目的,這些動作可能手動完成,也可能在安裝檔裡執行。
<每一次的資料處理>
每一次系統啟動,可能需要確保管理者帳號存在,也可能需要寄送 Email 或是複製檔案。

Kuick 專注在『每一次系統啟動的資料處理』,接下來說明,開發者要如何定義資料處理程式?系統啟動如何能確保處理程式必定執行?
在 Kuick.IStart 介面裡,定義 Kuick Application 啟動處理程序,所有實作 IStart 介面的類別,都將在系統啟動時載入並執行。對於每一次系統啟動的資料處理,我們再細分成兩類:

1. 被其他依存的資料初始
這部份的處理需求,請將程式寫在實作 Kuick.IStart 介面的類別裡的 DoPostDatabaseStart 事件處理器裡。

2. 沒有被其他依存的資料初始
這部份的處理需求,請將程式寫在實作 Kuick.IStart 介面的類別裡的 DoPostStart 事件處理器裡。

接下來用一個例子說明,如何分辦程式該實作於 DoPostDatabaseStart 還是 DoPostStart 裡:
RoleEntity, UserEntity

using System;
using System.Collections.Generic;
using Kuick.Data;
using Kuick;

namespace Sample
{
	[EntitySpec]
	public class RoleEntity : Entity<RoleEntity>
	{
		[ColumnSpec(SpecFlag.PrimaryKey)]
		public string RoleID { get; set; }

		[ColumnSpec]
		public string Name { get; set; }
	}


	[EntitySpec]
	public class UserEntity : Entity<UserEntity>
	{
		[ColumnSpec(SpecFlag.PrimaryKey)]
		public string UserName { get; set; }

		[ColumnSpec]
		[ColumnRefer(typeof(RoleEntity))]
		public string RoleID { get; set; }
	}
}

RoleEntity 被 UserEntity 依存,所以 RoleEntity 的資料初始化,必需實作在 DoPostDatabaseStart 事件處理器裡。

UserEntity 沒有被其他依存,所以 UserEntity 的資料初始化,必需實作在 DoPostStart 事件處理器裡。

OrganizationStart

using System;
using Kuick;

namespace Sample
{
	public class OrganizationStart : IStart
	{
		// Start
		public void DoPreStart(object sender, EventArgs e)
		{
		}

		public void DoBuiltinStart(object sender, EventArgs e)
		{
		}

		public void DoPluginStart(object sender, EventArgs e)
		{
		}

		public void DoPreDatabaseStart(object sender, EventArgs e)
		{
		}

		public void DoDatabaseStart(object sender, EventArgs e)
		{
		}

		public void DoPostDatabaseStart(object sender, EventArgs e)
		{
			if(!RoleEntity.Exists("Admin")) {
				RoleEntity role = new RoleEntity();
				role.RoleID = "Admin";
				role.Name = "Administrators";
				role.Add();
			}
		}

		public void DoPostStart(object sender, EventArgs e)
		{
			if(!UserEntity.Exists("Kuicker")) {
				UserEntity user = new UserEntity();
				user.UserName = "Kuicker";
				user.RoleID = "Admin";
				user.Add();
			}
		}

		// Terminate
		public void DoPluginTerminate(object sender, EventArgs e)
		{
		}

		public void DoBuiltinTerminate(object sender, EventArgs e)
		{
		}

		public void DoPostTerminate(object sender, EventArgs e)
		{
		}
	}
}

依據過往經驗,沒有被其他依存的資料初始需求相對來得多,所以提供另一個機制,程式可以寫在實作 Kuick.IInitializer 介面的類別裡的 Initiate 方法裡,由於要確保這段程式僅在系統啟動階段執行,另外提供實作 IInitializer 的基底類別 Initializer,以 OnInit 方法作為程式撰寫處。
OrganizationInitializer

using System;
using Kuick;

namespace Sample
{
	public class OrganizationInitializer : Initializer
	{
		protected override void OnInit()
		{
			if(!UserEntity.Exists("Kuicker")) {
				UserEntity user = new UserEntity();
				user.UserName = "Kuicker";
				user.RoleID = "Admin";
				user.Add();
			}
		}
	}
}

========================================
鐵人賽分享列表:Kuick Application & ORM Framework
開放原始碼專案:kuick.codeplex.com
直接下載原始碼:Kuick
下載相關文件檔:C# Code Conventions and Design Guideline
相關教學影片區:Kuick on YouTube


上一篇
Kuick -- Schema Sync 規格同步
下一篇
Kuick -- 事件替代 Trigger
系列文
Kuick Application & ORM Framework34

尚未有邦友留言

立即登入留言