다음을 통해 공유


DomainContext 및 작업

이 항목에서는 WCF RIA Services 응용 프로그램의 클라이언트가 도메인 컨텍스트를 사용하여 응용 프로그램 중간 계층의 도메인 서비스와 통신하는 방법에 대해 설명합니다. 클라이언트 프로젝트 내에서 도메인 서비스와 직접 상호 작용하는 대신 서버 프로젝트의 모든 도메인 서비스에 대한 도메인 컨텍스트 클래스가 클라이언트 프로젝트에서 생성됩니다. 사용할 도메인 서비스 메서드에 해당하는 도메인 컨텍스트 클래스에 대해 메서드를 호출합니다. 생성된 도메인 컨텍스트 클래스는 DomainContext 클래스에서 파생됩니다. 기본적으로 도메인 컨텍스트의 이름은 도메인 서비스의 이름을 지정하는 데 사용되는 후위 Service 대신 후위 Context를 사용하여 지정됩니다. 예를 들어 HRService라는 도메인 서비스에는 HRContext라는 해당하는 도메인 컨텍스트가 있습니다. 도메인 서비스 메서드를 정의하는 방법에 대한 자세한 내용은 도메인 서비스를 참조하십시오.

생성된 도메인 컨텍스트에는 다음 세 가지 생성자 메서드가 포함되어 있습니다.

  1. HTTP를 통해 도메인 서비스와 통신하기 위한 URI를 포함하는 기본 생성자

  2. 대체 URI를 지정할 수 있도록 하는 생성자

  3. 사용자 지정 DomainClient 구현을 제공할 수 있도록 하는 생성자. 이 생성자는 일반적으로 단위 테스트에 사용되거나 사용자 지정 전송 계층으로 리디렉션하는 데 사용됩니다.

DomainContext 클래스는 쿼리, 전송 및 호출 도메인 작업을 지원합니다. 각 유형의 작업에는 진행 중인 비동기 작업을 나타내는 해당하는 클래스가 있습니다. 이러한 클래스는 LoadOperation, SubmitOperationInvokeOperation입니다.

EntitySet 개체는 클라이언트에서 허용되는 작업(삽입, 업데이트 또는 삭제)을 나타내는 속성을 사용하여 도메인 컨텍스트에서 생성됩니다.

쿼리

도메인 컨텍스트의 쿼리 메서드 이름은 일반적으로 도메인 서비스의 쿼리 메서드 이름에 후위 Query를 결합한 것입니다. 예를 들어 도메인 컨텍스트의 GetCustomersQuery 메서드는 도메인 서비스의 GetCustomers 메서드에서 생성됩니다. 도메인 컨텍스트 쿼리 메서드는 추가 작업을 적용하는 데 사용할 수 있는 EntityQuery 개체를 반환합니다.

도메인 컨텍스트의 모든 쿼리는 비동기적으로 실행됩니다. 쿼리를 실행하려면 EntityQuery 개체를 Load 메서드에서 매개 변수로 전달합니다.

자세한 내용은 연습: 도메인 서비스에서 데이터 검색 및 표시를 참조하십시오.

다음 코드에서는 도메인 서비스에서 고객을 검색하는 방법을 보여 줍니다. 이 코드에서는 전화 번호가 583으로 시작하는 고객을 필터링하고 LastName을 기준으로 사전순으로 정렬합니다. DataGrid에 결과가 표시됩니다.

Partial Public Class MainPage
    Inherits UserControl

    Private _customerContext As New CustomerDomainContext

    Public Sub New()
        InitializeComponent()

        Dim query As EntityQuery(Of Customer)

        query = _
            From c In Me._customerContext.GetCustomersQuery() _
            Where c.Phone.StartsWith("583") _
            Order By c.LastName

        Dim loadOp = Me._customerContext.Load(query)
        CustomerGrid.ItemsSource = loadOp.Entities
    End Sub

End Class
public partial class MainPage : UserControl
{
    private CustomerDomainContext _customerContext = new CustomerDomainContext();

    public MainPage()
    {
        InitializeComponent();
        EntityQuery<Customer> query = 
            from c in _customerContext.GetCustomersQuery()
            where c.Phone.StartsWith("583")
            orderby c.LastName
            select c;
        LoadOperation<Customer> loadOp = this._customerContext.Load(query);
        CustomerGrid.ItemsSource = loadOp.Entities;
    }
}

데이터 수정

도메인 서비스에 엔터티 업데이트, 삽입 및 삭제 메서드가 포함된 경우 이러한 메서드는 도메인 컨텍스트에서 생성되지 않습니다. 대신 도메인 컨텍스트에 대해 SubmitChanges 메서드를 사용하고 도메인 서비스에 대한 적절한 작업이 호출됩니다. SubmitChanges를 호출할 때까지 데이터 소스가 변경되지 않습니다. RejectChanges 메서드를 호출하여 보류 중인 변경 내용을 취소할 수 있습니다.

DomainContext 클래스는 보류 중인 변경 내용을 평가할 수 있도록 HasChangesEntityContainer 속성도 제공합니다. 도메인 컨텍스트에 대한 EntityContainer 개체는 보류 중인 변경 내용을 추적합니다. 호출 작업은 호출될 때 즉시 실행되기 때문에 도메인 서비스의 호출 작업 호출은 보류 중인 변경 내용에 포함되지 않습니다. SubmitChanges를 호출하면 보류 중인 변경 내용이 도메인 서비스에 함께 전송됩니다.

EntitySet 개체에 대해 Add 메서드를 호출하거나 IEditableCollectionView 개체에 대해 AddNew 메서드를 호출하여 새 엔터티를 추가할 수 있습니다. AddNew 메서드를 호출하여 엔터티를 추가하면 새 엔터티가 데이터 소스에 저장되기 전에 해당 엔터티가 컬렉션에서 렌더링됩니다.

자세한 내용은 연습: 도메인 서비스에서 데이터 편집을 참조하십시오.

명명된 업데이트 메서드

도메인 컨텍스트에는 공용 액세스 한정자가 있고 IgnoreAttribute 특성으로 표시되지 않은 도메인 서비스의 명명된 업데이트 메서드 각각에 대한 메서드가 포함됩니다. 도메인 컨텍스트의 생성된 메서드에는 도메인 서비스의 메서드와 동일한 이름이 포함됩니다. 클라이언트 프로젝트에서 메서드를 호출하면 SubmitChanges가 호출될 때까지 메서드가 실제로 호출되지 않습니다. EntityContainer는 모든 명명된 업데이트 메서드 호출을 보류 중인 변경 내용으로 추적합니다. SubmitChanges를 호출하면 메서드가 비동기적으로 처리됩니다.

명명된 업데이트 메서드에서 매개 변수로 전달된 엔터티에 대해서도 동일한 명명된 업데이트 메서드가 클라이언트 프로젝트에서 생성됩니다. 따라서 명명된 업데이트 메서드는 도메인 컨텍스트의 인스턴스나 엔터티의 인스턴스를 통해 호출될 수 있습니다. 생성된 코드 파일을 열면 도메인 컨텍스트의 생성된 메서드가 엔터티의 생성된 메서드를 호출하는 것을 확인할 수 있습니다. 두 경우 모두 메서드를 실행하려면 도메인 컨텍스트에 대해 SubmitChanges 메서드를 호출해야 합니다.

다음 예제에서는 엔터티에 대해 ResetPassword라는 명명된 업데이트 메서드를 호출하는 방법을 보여 줍니다. OnSubmitCompleted는 데이터 작업의 결과를 처리하기 위해 구현하는 콜백 메서드입니다.

selectedCustomer.ResetPassword()
customerContext.SubmitChanges(AddressOf OnSubmitCompleted, Nothing)
selectedCustomer.ResetPassword();
customerContext.SubmitChanges(OnSubmitCompleted, null);

호출 작업

도메인 컨텍스트에는 도메인 서비스의 각 호출 작업에 대한 메서드가 포함됩니다. 도메인 작업과 달리 호출 작업은 즉시 실행되므로 SubmitChanges 메서드를 호출하지 않습니다. 호출 작업은 비동기적으로 실행되며 InvokeOperation 개체를 반환합니다. Value 속성의 값을 검색하여 서비스 작업에서 반환된 작업을 가져옵니다.

거의 모든 시나리오에서 호출 작업 대신 쿼리 작업을 사용하여 데이터를 로드해야 합니다. 쿼리 메서드는 단일 Entity 개체, IQueryable<Entity> 개체 또는 IEnumerable<Entity> 개체를 반환합니다. 쿼리 메서드는 중간 계층에서 DomainService로 지원되고, 클라이언트에서 DomainContext로 지원되는 데이터 패턴의 필수 요소입니다. RIA Services 프레임워크는 DomainService의 쿼리 메서드에서 반환되는 엔터티에 대해서만 클라이언트 프로젝트에서 엔터티를 생성합니다.

호출 작업은 엔터티가 아닌 데이터를 반환하고 파생 작업이 있는 작업을 실행하기 위한 out-of-band 메커니즘을 제공합니다. 파생 작업에 대한 자세한 내용은 HasSideEffects 속성을 참조하십시오. 호출 작업은 대개 쿼리 메서드에 적합하지 않습니다. 호출 작업에서 엔터티가 반환되는 경우에도 쿼리 메서드를 통해 반환되는 엔터티에 대해서만 클라이언트 프로젝트에 엔터티가 생성됩니다.

다음 예제에서는 GetLocalTemperature라는 호출 작업을 사용하는 방법을 보여 줍니다. 이 예제에서는 메서드가 엔터티 데이터와 관련되지 않은 값을 검색한다고 가정합니다.

Dim invokeOp As InvokeOperation(Of Integer)
invokeOp = customerContext.GetLocalTemperature(selectedPostalCode, AddressOf OnInvokeCompleted, Nothing)

Private Sub OnInvokeCompleted(ByVal invOp As InvokeOperation(Of Integer))
  If (invOp.HasError) Then
    MessageBox.Show(String.Format("Method Failed: {0}", invOp.Error.Message))
    invOp.MarkErrorAsHandled()
  Else
    result = invOp.Value
  End If
End Sub
InvokeOperation<int> invokeOp = customerContext.GetLocalTemperature(selectedPostalCode, OnInvokeCompleted, null);

private void OnInvokeCompleted(InvokeOperation<int> invOp)
{
  if (invOp.HasError)
  {
    MessageBox.Show(string.Format("Method Failed: {0}", invOp.Error.Message));
    invOp.MarkErrorAsHandled();
  }
  else
  {
    result = invOp.Value;
  }
}

오류 처리

데이터를 검색하거나 수정할 때 이러한 작업에서 발생할 수 있는 오류를 처리하는 방법을 결정해야 합니다. 데이터를 검색하거나 수정하는 도메인 컨텍스트에 대해 메서드를 호출할 때 오류를 처리하는 단계를 지정하는 매개 변수를 포함합니다. 데이터를 로드할 때는 오류가 무시되도록 지정할 수 있으며, 데이터를 수정할 때는 반환되는 예외를 처리해야 합니다. 자세한 내용은 클라이언트에서 오류 처리를 참조하십시오.