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