Sdílet prostřednictvím


Implementace obchodní logiky (LINQ to SQL)

Termín "obchodní logika" v tomto tématu odkazuje na všechna vlastní pravidla nebo ověřovací testy, které použijete u dat před vložením, aktualizací nebo odstraněním z databáze. Obchodní logika se také někdy označuje jako "obchodní pravidla" nebo "logika domény". V n-vrstvých aplikacích je obvykle navržena jako logická vrstva, aby ji bylo možné upravovat nezávisle na prezentační vrstvě nebo vrstvě přístupu k datům. Obchodní logiku může vyvolat vrstva přístupu k datům před nebo po jakékoli aktualizaci, vložení nebo odstranění dat v databázi.

Obchodní logika může být stejně jednoduchá jako ověření schématu, aby se zajistilo, že typ pole je kompatibilní s typem sloupce tabulky. Nebo se může skládat ze sady objektů, které interagují libovolnými složitými způsoby. Pravidla mohou být implementována jako uložené procedury v databázi nebo jako objekty v paměti. Obchodní logika je však implementovaná, LINQ to SQL umožňuje používat částečné třídy a částečné metody k oddělení obchodní logiky od kódu přístupu k datům.

Jak LINQ to SQL vyvolá obchodní logiku

Když vygenerujete třídu entity v době návrhu, a to buď ručně, nebo pomocí Návrhář relací objektů nebo SQLMetal, je definována jako částečná třída. To znamená, že v samostatném souboru kódu můžete definovat další část třídy entity, která obsahuje vlastní obchodní logiku. V době kompilace se obě části sloučí do jedné třídy. Pokud ale potřebujete znovu vygenerovat třídy entit pomocí Návrhář relací objektů nebo SQLMetalu, můžete to udělat a vaše část třídy se nezmění.

Částečné třídy definující entity a DataContext obsahují částečné metody. Jedná se o body rozšiřitelnosti, které můžete použít k použití obchodní logiky před a po jakékoli aktualizaci, vložení nebo odstranění entity nebo vlastnosti entity. Částečné metody lze považovat za události v době kompilace. Generátor kódu definuje podpis metody a volá metody v přístupových objektech get a set vlastností, DataContext konstruktoru a v některých případech na pozadí, kdy SubmitChanges je volána. Pokud však neimplementujete konkrétní částečnou metodu, všechny odkazy na ni a definice se v době kompilace odeberou.

V implementaci definice, kterou zapíšete do samostatného souboru kódu, můžete provést libovolnou vlastní logiku. Svou částečnou třídu můžete použít jako vrstvu domény nebo můžete volat z implementace definice částečné metody do samostatného objektu nebo objektů. V obou případech je obchodní logika čistě oddělená od kódu přístupu k datům i kódu prezentační vrstvy.

Bližší pohled na body rozšiřitelnosti

Následující příklad ukazuje část kódu vygenerovaného Návrhář relací objektů pro DataContext třídu, která má dvě tabulky: Customers a Orders. Všimněte si, že metody Insert, Update a Delete jsou definovány pro každou tabulku ve třídě.

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  

Pokud implementujete metody Insert, Update a Delete ve své částečné třídě, modul runtime LINQ to SQL je bude volat namísto vlastních výchozích metod při SubmitChanges volání. Díky tomu můžete přepsat výchozí chování operací vytvoření, čtení, aktualizace nebo odstranění. Další informace naleznete v tématu Návod: Přizpůsobení chování vkládání, aktualizace a odstraňování tříd entit.

Metoda OnCreated je volána v konstruktoru třídy.

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

Třídy entit mají tři metody, které volají modul runtime LINQ to SQL při vytváření, načtení a ověření entity (při SubmitChanges volání). Třídy entity mají také dvě částečné metody pro každou vlastnost, jednu, která je volána před nastavením vlastnosti, a jednu, která je volána po. Následující příklad kódu ukazuje některé z metod vygenerovaných pro Customer třídu:

#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  

Metody se volají v přístupovém objektu sady vlastností, jak je znázorněno v následujícím příkladu CustomerID vlastnosti:

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();  
        }  
     }  
}  

Ve své části třídy napíšete implementaci definice metody. Po zadání partial v sadě Visual Studio uvidíte IntelliSense pro definice metody v jiné části třídy.

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.  
        }  
    }  

Další informace o tom, jak do aplikace přidat obchodní logiku pomocí částečných metod, najdete v následujících tématech:

Postupy: Přidání ověřování do tříd entit

Návod: Přizpůsobení chování tříd entit při vložení, aktualizaci a odstranění

Návod: Přidání ověřování do tříd entit

Viz také