Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Термин "бизнес-логика" в этом разделе относится к любым пользовательским правилам или тестам проверки, которые применяются к данным до его вставки, обновления или удаления из базы данных. Бизнес-логика также иногда называется бизнес-правилами или логикой домена. В приложениях n-уровней он обычно разработан как логический слой, чтобы его можно было изменять независимо от уровня презентации или уровня доступа к данным. Бизнес-логика может вызываться уровнем доступа к данным до или после любого обновления, вставки или удаления данных в базе данных.
Бизнес-логика может быть как простой, как проверка схемы, чтобы убедиться, что тип поля совместим с типом столбца таблицы. Или он может состоять из набора объектов, взаимодействующих произвольно сложными способами. Правила могут быть реализованы как хранимые процедуры в базе данных или как объекты в памяти. Независимо от того, как реализована бизнес-логика, LINQ to SQL позволяет использовать частичные классы и частичные методы для разделения бизнес-логики и кода доступа к данным.
Как LINQ to SQL вызывает бизнес-логику
При создании класса сущностей во время разработки вручную или с помощью конструктора реляционных объектов или SQLMetal он определяется как частичный класс. Это означает, что в отдельном файле кода можно определить другую часть класса сущности, которая содержит пользовательскую бизнес-логику. Во время компиляции две части объединяются в один класс. Но если необходимо повторно создать классы сущностей с помощью конструктора реляционных объектов или SQLMetal, это можно сделать, и часть класса не будет изменена.
Частичные классы, которые определяют сущности, а DataContext содержат частичные методы. Это точки расширения, которые вы можете использовать для применения вашей бизнес-логики до и после любого обновления, вставки или удаления сущности или свойства сущности. Частичные методы можно рассматривать как события во время компиляции. Генератор кода определяет сигнатуру метода и вызывает методы в аксессорах свойств, конструкторе, а также в некоторых случаях неявно при вызове DataContext
. Однако если вы не реализуете определенный частичный метод, все ссылки на него и определение удаляются во время компиляции.
В реализации определения, написанного в отдельном файле кода, можно выполнять любую пользовательскую логику. Вы можете использовать ваш частичный класс в качестве слоя домена или вызвать реализацию частичного метода в отдельный объект или объекты. В любом случае бизнес-логика четко отделена от кода доступа к данным и кода слоя презентации.
Более подробный взгляд на точки расширяемости
В следующем примере показана часть кода, созданного реляционным конструктором объектов для 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
Если вы реализуете методы Вставка, Обновление и Удаление в частичном классе, то среда выполнения 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
Методы вызываются в механизме установления свойства, как показано в следующем примере для свойства 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.
}
}
Дополнительные сведения о добавлении бизнес-логики в приложение с помощью частичных методов см. в следующих разделах:
Практическое руководство. Добавление проверки в классы сущностей
Пошаговое руководство. Настройка поведения вставки, обновления и удаления классов сущностей
Пошаговое руководство. Добавление проверки в классы сущностей