Implementowanie logiki biznesowej (LINQ to SQL)

Termin "logika biznesowa" w tym temacie odnosi się do wszelkich niestandardowych reguł lub testów weryfikacji, które mają zastosowanie do danych przed ich wstawieniem, zaktualizowanym lub usuniętym z bazy danych. Logika biznesowa jest również czasami nazywana "regułami biznesowymi" lub "logiką domeny". W aplikacjach n-warstwowych zazwyczaj jest ona zaprojektowana jako warstwa logiczna, dzięki czemu można ją modyfikować niezależnie od warstwy prezentacji lub warstwy dostępu do danych. Logika biznesowa może być wywoływana przez warstwę dostępu do danych przed lub po każdej aktualizacji, wstawieniu lub usunięciu danych w bazie danych.

Logika biznesowa może być tak prosta, jak walidacja schematu, aby upewnić się, że typ pola jest zgodny z typem kolumny tabeli. Może też składać się z zestawu obiektów, które wchodzą w interakcje w dowolny złożony sposób. Reguły mogą być implementowane jako procedury składowane w bazie danych lub jako obiekty w pamięci. Jednak logika biznesowa jest implementowana, LINQ to SQL umożliwia używanie klas częściowych i metod częściowych do oddzielenia logiki biznesowej od kodu dostępu do danych.

Jak LINQ to SQL wywołuje logikę biznesową

Podczas generowania klasy jednostki w czasie projektowania ręcznie lub przy użyciu relacyjnej Projektant obiektu lub SQLMetal jest definiowana jako klasa częściowa. Oznacza to, że w osobnym pliku kodu można zdefiniować inną część klasy jednostki, która zawiera niestandardową logikę biznesową. W czasie kompilacji obie części są scalane w jedną klasę. Jeśli jednak musisz ponownie wygenerować klasy jednostek przy użyciu Projektant obiektowych lub SQLMetal, możesz to zrobić, a część klasy nie zostanie zmodyfikowana.

Klasy częściowe, które definiują jednostki i DataContext zawierają metody częściowe. Są to punkty rozszerzalności, których można użyć do zastosowania logiki biznesowej przed i po każdej aktualizacji, wstawieniu lub usunięciu dla jednostki lub właściwości jednostki. Metody częściowe można traktować jako zdarzenia w czasie kompilacji. Generator kodu definiuje sygnaturę metody i wywołuje metody w metodzie get i set, konstruktor, a w niektórych przypadkach za kulisami DataContext , gdy SubmitChanges jest wywoływana. Jeśli jednak nie zaimplementujesz określonej metody częściowej, wszystkie odwołania do niej i definicja zostaną usunięte w czasie kompilacji.

W definicji implementowania, którą piszesz w osobnym pliku kodu, możesz wykonać dowolną logikę niestandardową. Możesz użyć częściowej klasy jako warstwy domeny lub wywołać metodę implementowania metody częściowej do oddzielnego obiektu lub obiektów. Tak czy inaczej logika biznesowa jest czysta od kodu dostępu do danych i kodu warstwy prezentacji.

Bliżej przyjrzyj się punktom rozszerzalności

W poniższym przykładzie pokazano część kodu wygenerowanego przez Projektant Object Relational dla DataContext klasy, która ma dwie tabele: Customers i Orders. Należy pamiętać, że metody Insert, Update i Delete są zdefiniowane dla każdej tabeli w klasie.

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  

W przypadku zaimplementowania metod Insert, Update i Delete w klasie częściowej środowisko uruchomieniowe LINQ to SQL wywoła je zamiast własnych metod domyślnych podczas SubmitChanges wywoływania. Dzięki temu można zastąpić domyślne zachowanie operacji tworzenia/odczytu/aktualizacji/usuwania. Aby uzyskać więcej informacji, zobacz Przewodnik: dostosowywanie zachowania wstawiania, aktualizowania i usuwania klas jednostek.

Metoda jest wywoływana OnCreated w konstruktorze klasy.

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

Klasy jednostek mają trzy metody wywoływane przez środowisko uruchomieniowe LINQ to SQL podczas tworzenia, ładowania i weryfikowania jednostki (gdy SubmitChanges jest wywoływana). Klasy jednostek mają również dwie metody częściowe dla każdej właściwości, jedną, która jest wywoływana przed ustawieniem właściwości, i jedną, która jest wywoływana po. Poniższy przykład kodu przedstawia niektóre metody wygenerowane dla Customer klasy:

#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 są wywoływane w metodzie dostępu zestawu właściwości, jak pokazano w poniższym przykładzie CustomerID dla właściwości:

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

W swojej części klasy piszesz definicję implementowania metody . W programie Visual Studio po wpisaniu partial zobaczysz funkcję IntelliSense dla definicji metod w innej części klasy.

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

Aby uzyskać więcej informacji na temat dodawania logiki biznesowej do aplikacji przy użyciu metod częściowych, zobacz następujące tematy:

Instrukcje: dodawanie walidacji do klas jednostek

Przewodnik: dostosowywanie zachowania wstawiania, aktualizacji i usuwania dla klas jednostek

Przewodnik: dodawanie walidacji do klas jednostek

Zobacz też