다음을 통해 공유


비즈니스 논리 구현(LINQ to SQL)

이 항목의 "비즈니스 논리"라는 용어는 데이터베이스에서 데이터를 삽입, 업데이트 또는 삭제하기 전에 데이터에 적용하는 사용자 지정 규칙 또는 유효성 검사 테스트를 나타냅니다. 비즈니스 논리를 "비즈니스 규칙" 또는 "도메인 논리"라고도 합니다. n 계층 애플리케이션에서는 일반적으로 프레젠테이션 계층 또는 데이터 액세스 계층과 독립적으로 수정할 수 있도록 논리적 계층으로 설계되었습니다. 데이터베이스에서 데이터를 업데이트, 삽입 또는 삭제하기 전이나 후에 데이터 액세스 계층에서 비즈니스 논리를 호출할 수 있습니다.

비즈니스 논리는 스키마 유효성 검사만큼 간단하여 필드 형식이 테이블 열의 형식과 호환되는지 확인할 수 있습니다. 또는 임의로 복잡한 방식으로 상호 작용하는 개체 집합으로 구성됩니다. 규칙은 데이터베이스의 저장 프로시저 또는 메모리 내 개체로 구현될 수 있습니다. 그러나 비즈니스 논리가 구현되지만 LINQ to SQL을 사용하면 부분 클래스 및 부분 메서드를 사용하여 비즈니스 논리를 데이터 액세스 코드와 분리할 수 있습니다.

LINQ to SQL에서 비즈니스 논리를 호출하는 방법

디자인 타임에 수동으로 또는 개체 관계형 디자이너 또는 SQLMetal을 사용하여 엔터티 클래스를 생성하는 경우 부분 클래스로 정의됩니다. 즉, 별도의 코드 파일에서 사용자 지정 비즈니스 논리를 포함하는 엔터티 클래스의 다른 부분을 정의할 수 있습니다. 컴파일 시 두 부분이 단일 클래스로 병합됩니다. 그러나 개체 관계형 디자이너 또는 SQLMetal을 사용하여 엔터티 클래스를 다시 생성해야 하는 경우 이 작업을 수행할 수 있으며 클래스의 일부가 수정되지 않습니다.

엔터티를 정의하는 partial 클래스와 DataContext는 partial 메서드를 포함합니다. 엔터티 또는 엔터티 속성에 대한 업데이트, 삽입 또는 삭제 전후에 비즈니스 논리를 적용하는 데 사용할 수 있는 확장성 지점입니다. 부분 메서드는 컴파일 시간 이벤트로 간주할 수 있습니다. 코드 생성기는 메서드 시그니처를 정의하고 get 및 set 속성 접근자, DataContext 생성자, 그리고 때때로 SubmitChanges 호출 시 내부 처리되는 메서드를 호출합니다. 그러나 특정 부분 메서드를 구현하지 않으면 컴파일 시간에 해당 메서드 및 정의에 대한 모든 참조가 제거됩니다.

별도의 코드 파일에 작성하는 구현 정의에서 필요한 사용자 지정 논리를 수행할 수 있습니다. 부분 클래스를 도메인 계층으로 사용할 수 있으며, 또는 부분 메서드의 구현 정의에서 별도의 객체로 호출할 수도 있습니다. 어느 쪽이든 비즈니스 논리는 데이터 액세스 코드와 프레젠테이션 계층 코드 모두에서 완전히 분리됩니다.

확장성 지점을 자세히 살펴보기

다음 예제는 두 개의 테이블 DataContextCustomers이 있는 Orders 클래스에 대해 개체 관계형 디자이너가 생성한 코드의 일부를 보여 줍니다. 삽입, 업데이트 및 삭제 메서드는 클래스의 각 테이블에 대해 정의됩니다.

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  

Partial 클래스에서 Insert, Update 및 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  

메서드는 속성에 대한 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.  
        }  
    }  

부분 메서드를 사용하여 애플리케이션에 비즈니스 논리를 추가하는 방법에 대한 자세한 내용은 다음 항목을 참조하세요.

방법: 엔터티 클래스에 유효성 검사 추가

연습: 엔터티 클래스의 삽입, 업데이트 및 삭제 동작 사용자 지정

연습: 엔터티 클래스에 유효성 검사 추가

참고하십시오