本文章是由機器翻譯。

工具箱

Active 的記錄模式,外觀導向程式設計

Scott Mitchell

所有價格在 2008 12 月 29,確認,並受到程式變更。 此資料行中是單獨的作者,不一定會反映在 Microsoft 的意見。

內容

您的.NET 應用程式中實作 Active 記錄模式
在.NET Framework 的外觀-導向程式設計

您的.NET 應用程式中實作 Active 記錄模式

現用的記錄模式通常用於資料導向的應用程式模型的資料庫資料表或資料的類別方面的檢視,類別的執行個體所模型化資料庫資料表的一個資料列。 在這種模式類別的屬性會對應至對應的資料庫資料表的資料行中。

類別的執行個體方法上執行作業資料庫記錄,而其靜態方法會使用整個資料表。 例如,如果資料庫會包含具有 uniqueidentifier、 名稱的 nvarchar(50) 和薪資為一個金錢的資料行 EmployeeId 名員工資料表,實作,現用的記錄模式您要建立具有名為 EmployeeId、 名稱和薪資的屬性名員工的類別。 員工的類別會包含例如建立,儲存,並刪除,可能會包含 DeleteAll、 以及 Find,FindAll 的靜態方法的執行個體方法。

[圖 1 ] 顯示作用中記錄的模式。 它提供了簡單、 直覺式的語法,使用資料,許多物件關聯 mappers (O / RM) 所使用的模式。

[圖 1 Active 記錄模式,在 [動作]

// Add Andrew Fuller as a new employee  
Employee emp = new Employee();
emp.Name = "Andrew Fuller";
emp.Salary = 50000.00M;
emp.Create();

// Give a 10% raise to all employees 
Employee[] allEmployees = Employee.FindAll();
foreach (Employee current in allEmployees)
{
    current.Salary *= 1.10M;
    current.Save();
} 

城堡 ActiveRecord (版本 1.0 中,RC3) 專案也會提供一個快速簡易的方法實作 Microsoft.NET Framework 架構應用程式的作用中記錄的模式。 它建置它在 NHibernate 免費、 開放原始碼 O / RM 工具並在檢閱的最上層, 2006 年 10 月的工具箱] 資料行.

其中一個 NHibernate 的缺點是它會有工夫學習曲線的一個位元,並要求開發人員建立和維護 XML 對應檔案的結合,資料庫資料表、 資料行和使用類別和屬性的關聯性的應用程式時。 ActiveRecord 專案 API 會使用.NET 屬性 (Attribute) 會封裝許多這樣的複雜性,並讓實作簡單的現用的記錄模式。

若要開始使用,請從專案的首頁下載安裝套件。 此安裝 ActiveRecord 和 NHibernate 的組件和它們看到 Visual Studio ; 將這些組件加入至專案。 接下來,在您將會使用 Active 記錄模式,模型資料庫資料表的應用程式中建立類別。

這是員工類別中所參考的程式碼 [圖 1 :

[ActiveRecord]
public class Employee : ActiveRecordBase<Employee>
{
    [PrimaryKey] public Guid EmployeeId { get; set; }
    [Property] public string Name { get; set; }
    [Property] public decimal Salary { get; set; }
}

請注意員工類別擴充 ActiveRecordBase 類別,並使用屬性的屬性會對應至資料庫資料表中的資料行,以及哪些資料行會做為主索引鍵的旗標。 在 ActiveRecordBase 類別會定義執行個體,例如建立並儲存方法] 和 [靜態方法,包括尋找、 FindAll 和 DeleteAll。

您可以藉由傳遞透過包含在字串的長度,PrimaryKey 和屬性屬性的參數中資料行、 資料行是否在資料行可以指派資料庫,NULL 值,如果需要唯一的值和是否忽略資料行插入或更新類別執行個體時,提供需員工類別中的每個成員的詳細資訊。

一起建立員工類別,您也要定義一些組態設定值例如資料庫連接字串和 NHibernate-特定選項的。 但是不需要撰寫任何資料存取程式碼。 為您自動處理 NHibernate 與 ActiveRecord 專案。 事實上,您甚至不必為 ActiveRecord 專案可以自動產生資料表您根據您已建立的類別,具有在此時建立資料庫資料表。

ActiveRecord 專案的屬性語法也可用來建立類別之間的關係。 例如,HasMany 和 BelongsTo 屬性可以用來在父代和子類別中分別,表示一個-一對多關聯。 想像一下資料模型已展開,以具有資料行 DepartmentId 和名稱,DepartmentId 資料行的一個部門] 表格中納入員工資料表建立一個部門與員工之間-一對多關聯。 這個關聯性會在應用程式中由模式化加入部門類別以及更新員工類別包含新的屬性 (請參閱 [圖 2 )。

[圖 2 新增員工類別

[ActiveRecord]
public class Department : ActiveRecordBase<Department>
{
    [PrimaryKey] public int DepartmentId { get; set; }
    [Property] public string Name { get; set; }
    [HasMany(typeof(Employee))] public IList Employees { get; set; }
}

[ActiveRecord]
public class Employee : ActiveRecordBase<Employee>
{
    ...
    [BelongsTo("DepartmentId")] public Department Department { get; set; }
}

請注意部門類別具有的員工屬性,傳回特定部門的執行個體的員工物件的集合。 同樣地,員工物件都具有部門屬性,傳回該員工屬於該部門的資訊。

ActiveRecord 專案可讓您輕鬆開始建立應用程式的架構,經證實的架構 NHibernate 的上方。 您可以在幾分鐘內製作類別,使用 Active 記錄模式,而不需要母片 NHibernate 的 XML 組態的語法。

價格: 可用,開放原始碼。

castleproject.org/activerecord

在.NET Framework 的外觀-導向程式設計

在中央的宗旨,鼓勵分隔的應用程式的功能和功能,為非重疊的模組的軟體工程的區隔問題。 每個程式設計開發架構都有它自己的技巧鼓勵這。 程序的程式設計語言允許開發人員封裝的副程式的功能 ; 請物件導向程式設計語言使用類別。

安全性,登入,和快取都是考量,通常是套用到多個模組,實作時, 產生分散在規則套用至這些模組的程式碼的例子。 這些類型的問題稱為跨剪下,並且稱為方面。

程式設計的開發架構著重於處理跨剪下的考量之分隔外觀導向程式設計 (AOP)。 AOP 允許開發人員在單一模組中建立方面,並再指定這些執行時,才能成功,與等等的方法完成時方法的執行。

例如,AOP 開發人員可以建置執行方法的執行之前,會驗證使用者屬於特定的角色,並再指定哪些方法,外觀的外觀與適用。 程式的結果時其中一個指定方法是在執行階段執行,對應方面碼執行第一次。 AOP 通常是透過實作程式碼 weaving,其中牽涉到適當的點,在應用程式程式碼中注入方面的程式碼 — 不論是在編譯時間或執行階段期間的結尾。

查看 PostSharp (版本 1.5) 在可用,Gael Fraiteur 建立的開放原始碼程式庫您可以用來實作 AOP) 技術,在.NET Framework 中。 在其核心中,PostSharp 分析,並轉換以便 weaving 程式碼實作 AOP 所需的.NET 組件。

在這個核心建置是 PostSharp Laos,輕量型的外觀導向的系統,可讓開發人員建立和使用自訂屬性 (Attribute) 的方面。 部分藉由使用自訂屬性裝飾它們然後可以套用至類別或方法。 或者,方面,可以套用到所有的類別或在專案的 AssemblyInfo 檔案中有語法透過特定命名模式的方法。

[圖 3 ] 顯示錯誤通知在 PostSharp 方面的範例。 這方面會擴充,OnExceptionAspect,表示外觀可以執行以回應未處理的例外狀況可能電子郵件傳送例外狀況的系統管理員詳細資料。 這方面可以套用至特定方法,藉由裝飾它 OnException 屬性 (Attribute 如下所示:

[OnException("admin@contoso.com")]
private void MyMethod()
{
    // ...
}

[圖 3 PostSharp 方面錯誤通知

public class OnExceptionAttribute : OnExceptionAspect
 {
    public string ToAddress { get; set; }

    public OnExceptionAttribute(string to)
    {
        ToAddress = to;
    }

    public override void OnException(MethodExecutionEventArgs e)
    {
        // TODO: Send ToAddress an e-mail detailing the exception details.
        // Exception details available in the MethodExecutionEventArgs object
    }
}

立即已編譯程式碼之後,PostSharp 會修改 MyMethod 的 IL 程式碼,周圍現有碼與 try...catch OnException 方法,在 catch 區塊內一個呼叫。結果時未處理的 MyMethod 的例外狀況會叫用 OnException 外觀。

您會發現在 PostSharp 網站,連同有用的留言板的詳細文件。有也建立社群的外掛程式、 程式庫和其他工具,利用或延伸 PostSharp。

價格:可用,開放原始碼。

postsharp.org

您問題或意見寄至toolsmm@Microsoft.com.

Scott Mitchell 的許多書籍和的作者著有也是從 1998 年就從事 Microsoft Web 技術工作者的 MVP。Scott 是一個獨立的顧問、 培訓講師和寫入器。他在Mitchell@4guysfromrolla.com透過或在他的部落格ScottOnWriting.NET.