Поделиться через


Реализация бизнес-логики (LINQ to SQL)

Термин "бизнес-логика" в данном разделе относится к любым пользовательским правилам или проверкам, которые применяются к данным перед их вставкой, обновлением или удалением в базе данных. Бизнес-логика также иногда называется бизнес-правилами или логикой домена. В приложениях n-уровней он обычно разработан как логический слой, чтобы его можно было изменять независимо от уровня презентации или уровня доступа к данным. Бизнес-логика может вызываться уровнем доступа к данным перед обновлением, вставкой или удалением данных в базе данных или после выполнения этих операций.

Бизнес-логика может представлять собой простую схему проверки совместимости типа поля с типом столбца таблицы. Она также может состоять из набора объектов, взаимодействующих произвольным и довольно сложным образом. Правила могут реализовываться в виде хранимых процедур для базы данных или в качестве объектов, содержащихся в памяти. Однако бизнес-логика реализована, LINQ to SQL позволяет использовать частичные классы и частичные методы для разделения бизнес-логики от кода доступа к данным.

Способы вызова бизнес-логики технологией LINQ to SQL

При создании класса сущностей во время разработки вручную или с помощью реляционный конструктор объектов или SQLMetal он определяется как частичный класс. Это означает, что в отдельном файле с исходным кодом можно определить другую часть этого класса сущностей, содержащего пользовательскую бизнес-логику. Во время компиляции обе части объединяются в один класс. Но если необходимо повторно создать классы сущностей с помощью реляционный конструктор объектов или SQLMetal, это можно сделать, и часть класса не будет изменена.

Разделяемые классы, которые определяют сущности, и класс DataContext содержат разделяемые методы. Эти методы являются точками расширения, которые можно использовать для применения бизнес-логики перед обновлением, вставкой или удалением сущности или свойства сущности, а также после выполнения этих операций. Разделяемые методы можно рассматривать как события времени компиляции. Генератор кода определяет сигнатуру метода и вызывает эти методы в методах доступа к свойствам "get" и "set", конструкторе DataContext и в некоторых случаях неявным образом при вызове метода SubmitChanges. Однако, если не реализовать определенный разделяемый метод, все ссылки на него и определение удаляются во время компиляции.

В определении реализации, созданном в отдельном файле с исходным кодом, можно выполнить любую требуемую пользовательскую логику. Можно использовать разделяемый класс в качестве уровня домена или вызывать его из определения реализации разделяемого метода в отдельном объекте или объектах. В любом случае бизнес-логика полностью отделена как от кода уровня доступа к данным, так и от кода уровня представления данных.

Более подробное рассмотрение точек расширения

В следующем примере показана часть кода, созданного реляционный конструктор объектов для DataContext класса с двумя таблицами: Customers и Orders. Обратите внимание, что методы "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 and Delete в частичном классе, среда выполнения LINQ to SQL вызовет их вместо собственных методов по умолчанию при SubmitChanges вызове. Это позволяет переопределить поведение, реализуемое по умолчанию для операций создания, чтения, обновления и удаления. Дополнительные сведения см. в пошаговом руководстве. Настройка поведения вставки, обновления и удаления классов сущностей.

Метод 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.  
        }  
    }  

Дополнительные сведения о добавлении бизнес-логики в приложение с помощью разделяемых методов см. в следующих разделах.

Практическое руководство. Добавление проверки в классы сущностей

Пошаговое руководство. Настройка поведения вставки, обновления и удаления классов сущностей

Пошаговое руководство. Добавление проверки в классы сущностей

См. также