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


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

Обновлен: November 2007

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

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

Бизнес-логика в технологии 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" и "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.
        }
    }

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

Как добавить проверку в классы сущностей

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

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

См. также

Основные понятия

Разделяемые методы

Ссылки

Разделяемые классы и методы (Руководство по программированию на C#)

Средство создания кода (SqlMetal.exe)

Другие ресурсы

Реляционный конструктор объектов