分享方式:


實作商務邏輯 (LINQ to SQL)

本主題中的「商務邏輯」一詞,指的是您套用到資料的任何自訂規則或驗證測試,待套用之後,資料才會在資料庫中插入、更新或刪除。 商務邏輯有時也稱為「商務規則」或「定義域邏輯」。在 N-Tier 應用程式中,這通常會設計為邏輯層,以便與展示層或資料存取層分開修改。 資料存取層可在資料庫中的資料更新、插入或刪除之前或之後叫用 (Invoke) 商務邏輯。

商務邏輯可以簡單如結構描述驗證,用來確定欄位的型別與資料表資料行相容。 或者也可以包含一組物件,以各種複雜的方式互動。 這些規則可實作為資料庫上的預存程序 (Stored Procedure) 或實作為記憶體中的物件。 不論商務邏輯如何實作,LINQ to SQL 都可讓您使用部分類別和部分方法,將商務邏輯與資料存取程式碼分開。

LINQ to SQL 如何叫用商務邏輯

當您在設計階段以手動方式或使用物件關聯式設計工具或 SQLMetal 產生實體類別時,其定義會是部分類別。 這表示,您可以在不同的程式碼檔案中,定義包含自訂商務邏輯之實體類別的另一個部分。 在編譯階段,這兩個部分會合併成單一類別。 如果您必須使用物件關聯式設計工具或 SQLMetal 重新產生實體類別,雖然可以這麼做,但您的類別部分將不會修改。

定義實體和 DataContext 的部分類別包含部分方法。 您可使用這些方法當做擴充點,在實體或實體屬性進行任何更新、插入或刪除之前和之後套用商務邏輯。 部分方法可視為編譯時間事件。 程式碼產生器會定義方法簽章,當 DataContext 被呼叫時,會在 get 和 set 屬性存取子、SubmitChanges 建構函式,以及某些情況下在幕後呼叫方法。 不過,如果您沒有實作特定部分方法,則對該方法的所有參考以及定義將在編譯時期移除。

您可以在另外一個程式碼檔案撰寫的實作定義中,執行任何必要的自訂邏輯。 您可以使用部分類別本身當做定義域層,或可以從部分方法的實作定義呼叫到另外的物件。 無論使用哪種方式,商務邏輯都能完全與資料存取程式碼和展示層程式碼分開。

詳述擴充點

下列範例顯示了物件關聯式設計工具為 DataContext 類別 (具有 CustomersOrders 這兩個資料表) 產生的部分程式碼。 請注意,這個類別中的每個資料表都定義了 Insert、Update 和 Delete 方法。

Partial Public Class Northwnd  
    Inherits System.Data.Linq.DataContext  
  
    Private Shared mappingSource As _  
        System.Data.Linq.Mapping.MappingSource = New _  
        AttributeMappingSource  
  
    #Region "Extensibility Method Definitions"  
    Partial Private Sub OnCreated()  
    End Sub  
    Partial Private Sub InsertCustomer(instance As Customer)  
    End Sub  
    Partial Private Sub UpdateCustomer(instance As Customer)  
    End Sub  
    Partial Private Sub DeleteCustomer(instance As Customer)  
    End Sub  
    Partial Private Sub InsertOrder(instance As [Order])  
    End Sub  
    Partial Private Sub UpdateOrder(instance As [Order])  
    End Sub  
    Partial Private Sub DeleteOrder(instance As [Order])  
    End Sub  
    #End Region  
public partial class MyNorthWindDataContext : System.Data.Linq.DataContext  
    {  
        private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();  
  
        #region Extensibility Method Definitions  
        partial void OnCreated();  
        partial void InsertCustomer(Customer instance);  
        partial void UpdateCustomer(Customer instance);  
        partial void DeleteCustomer(Customer instance);  
        partial void InsertOrder(Order instance);  
        partial void UpdateOrder(Order instance);  
        partial void DeleteOrder(Order instance);  
        #endregion  

如果您在部分類別中實作 Insert、Update 和 Delete 方法,那麼當呼叫 SubmitChanges 時,LINQ to SQL 執行階段會呼叫這些方法,而不會呼叫自己的預設方法。 這可讓您覆寫建立/讀取/更新/刪除作業的預設行為。 如需詳細資訊,請參閱逐步解說:自訂實體類別的插入、更新和刪除行為

OnCreated 方法是在類別建構函式中呼叫的。

Public Sub New(ByVal connection As String)  
    MyBase.New(connection, mappingSource)  
    OnCreated()  
End Sub  
public MyNorthWindDataContext(string connection) :  
            base(connection, mappingSource)  
        {  
            OnCreated();  
        }  

LINQ to SQL 執行階段會在建立、載入和驗證實體時 (呼叫 SubmitChanges 時),呼叫實體類別的三個方法。 實體類別還有適用於每個屬性的兩個部分方法,一是在屬性設定之前呼叫,另一則是在之後呼叫。 下列程式碼範例顯示為 Customer 類別產生的一些方法:

#Region "Extensibility Method Definitions"  
    Partial Private Sub OnLoaded()  
    End Sub  
    Partial Private Sub OnValidate(action As _  
        System.Data.Linq.ChangeAction)  
    End Sub  
    Partial Private Sub OnCreated()  
    End Sub  
    Partial Private Sub OnCustomerIDChanging(value As String)  
    End Sub  
    Partial Private Sub OnCustomerIDChanged()  
    End Sub  
    Partial Private Sub OnCompanyNameChanging(value As String)  
    End Sub  
    Partial Private Sub OnCompanyNameChanged()  
    End Sub  
' ...Additional Changing/Changed methods for each property.  
#region Extensibility Method Definitions  
    partial void OnLoaded();  
    partial void OnValidate();  
    partial void OnCreated();  
    partial void OnCustomerIDChanging(string value);  
    partial void OnCustomerIDChanged();  
    partial void OnCompanyNameChanging(string value);  
    partial void OnCompanyNameChanged();  
// ...additional Changing/Changed methods for each property  

這些方法會在屬性 set 存取子中呼叫,如下列 CustomerID 屬性的範例所示:

Public Property CustomerID() As String  
    Set  
        If (String.Equals(Me._CustomerID, value) = False) Then  
            Me.OnCustomerIDChanging(value)  
            Me.SendPropertyChanging()  
            Me._CustomerID = value  
            Me.SendPropertyChanged("CustomerID")  
            Me.OnCustomerIDChanged()  
        End If  
    End Set  
End Property  
public string CustomerID  
{  
    set  
    {  
        if ((this._CustomerID != value))  
        {  
            this.OnCustomerIDChanging(value);  
            this.SendPropertyChanging();  
            this._CustomerID = value;  
            this.SendPropertyChanged("CustomerID");  
            this.OnCustomerIDChanged();  
        }  
     }  
}  

在您的類別部分中,您可以撰寫方法的實作定義。 在 Visual Studio 中鍵入 partial 之後,您就會看到 IntelliSense 為類別另一部分完成的方法定義。

Partial Public Class Customer  
    Private Sub OnCustomerIDChanging(value As String)  
        ' Perform custom validation logic here.  
    End Sub  
End Class  
partial class Customer
    {  
        partial void OnCustomerIDChanging(string value)  
        {  
            //Perform custom validation logic here.  
        }  
    }  

如需如何使用部分方法將商務邏輯加入到應用程式中,請參閱下列主題:

如何:將驗證新增至實體類別

逐步解說:自訂實體類別的插入、更新和刪除行為

逐步解說:為實體類別加入驗證

另請參閱