도메인 서비스

도메인 서비스는 WCF RIA Services 응용 프로그램의 비즈니스 논리를 캡슐화하는 WCF(Windows Communication Foundation) 서비스입니다. 도메인 서비스는 관련 작업의 집합을 서비스 계층 형태로 노출합니다. 도메인 서비스를 정의할 때 도메인 서비스를 통해 허용되는 데이터 작업을 지정합니다.

도메인 서비스를 디자인할 때 사용자가 응용 프로그램에서 수행할 것으로 예상되는 관련 작업의 집합으로 도메인 서비스를 간주해야 합니다. 일반적으로 이러한 작업에는 밀접하게 관련된 엔터티의 작은 그룹이 포함됩니다. 예를 들어 비용 보고 응용 프로그램에서 비용 보고서, 개별 품목 및 세부 정보에 대한 엔터티를 노출하고 별도의 도메인 서비스에 계정과 지불에 대한 엔터티를 배치할 수 있습니다.

도메인 서비스 및 해당 데이터 소스

DomainService 클래스는 도메인 서비스 역할을 하는 모든 클래스의 기본 클래스입니다. 사용자 지정 데이터 개체에 바인딩되는 도메인 서비스를 만들려면 DomainService에서 직접 파생되는 클래스를 만듭니다. 그러나 ADO.NET 엔터티 모델에 바인딩되거나 LINQ to SQL 데이터베이스를 노출하는 도메인 서비스가 있는 경우 대신 사용하는 DomainService에서 파생되는 특수한 추상 클래스가 있습니다.

  • ADO.NET 엔터티 모델에 바인딩되는 도메인 서비스를 만들려면 LinqToEntitiesDomainService에서 파생되는 클래스를 만듭니다. RIA Services 에서는 LinqToEntitiesDomainService 클래스를 제공합니다.

  • 응용 프로그램에서 LINQ to SQL 클래스를 노출하는 도메인 서비스를 만들려면 LinqToSqlDomainService에서 파생되는 클래스를 만듭니다. 이 클래스는 RIA Services 도구 키트에서 제공됩니다. 이 클래스를 사용하여 응용 프로그램에서 LINQ to SQL 클래스를 노출하는 도메인 서비스를 만들려면 RIA Services 도구 키트를 다운로드해야 합니다.

새 도메인 서비스 클래스 추가 대화 상자를 사용하여 도메인 서비스를 만드는 경우 만들어진 도메인 서비스의 유형은 노출하는 엔터티에 따라 결정됩니다.

도메인 서비스를 클라이언트 프로젝트에서 사용할 수 있게 만들려면 해당 서비스 클래스를 EnableClientAccessAttribute 특성으로 표시해야 합니다. 새 도메인 서비스 클래스 추가 대화 상자에서 클라이언트 액세스 사용 확인란을 선택하면 EnableClientAccessAttribute 특성이 도메인 서비스에 자동으로 적용됩니다. EnableClientAccessAttribute 특성이 도메인 서비스에 적용되는 경우 RIA Services 에서는 클라이언트 프로젝트에 해당하는 클래스를 생성합니다. 예를 들어 Employee라는 엔터티를 노출하는 HRService라는 도메인 서비스에 EnableClientAccessAttribute 특성을 적용하는 경우 RIA Services 에서는 클라이언트 프로젝트에서 HRContext라는 도메인 컨텍스트와 Employee 엔터티의 클라이언트 버전을 생성합니다.

WCF 및 도메인 서비스

WCF(Windows Communication Foundation) 서비스인 도메인 서비스는 WCF 개념을 기반으로 합니다. 도메인 서비스는 다음을 보존합니다.

  • WCF 서비스의 표준 사용

  • 작업 계약, 작업 동작 및 서비스 동작과 같은 기존 WCF 프로그래밍 모델 구문

  • 바인딩 구성, 동작 구성 및 관리 인프라와 같은 표준 WCF 사용자 지정 기능

도메인 컨텍스트는 채널을 만들어 도메인 서비스에서 생성된 서비스 계약을 전달하기 위해 WCF ChannelFactory를 사용하여 RIA Services 도메인 서비스와 통신합니다.

기본적으로 이진 끝점만 도메인 서비스에 사용할 수 있습니다. 이진 끝점을 사용하기 위해 추가 구성이 필요하지는 않습니다. OData, JSON, SOAP, 사용자 지정 호스트 등의 다른 끝점을 사용하려면 다음과 같이 Web.config 파일에서 끝점 팩터리를 등록해야 합니다.

<configSections>
  <sectionGroup name="system.serviceModel">
    <section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowDefinition="MachineToApplication" requirePermission="false" />
  </sectionGroup>
</configSections>

<system.serviceModel>
  <domainServices>
    <endpoints>
      <add name="json" type="Microsoft.ServiceModel.DomainService.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainService.Hosting" />
    </endpoints>
  </domainServices>
<system.serviceModel>

System.ServiceModel.DomainServices.Hosting 네임스페이스에는 RIA Services 에서 지원되는 끝점이 포함되어 있습니다. Microsoft.ServiceModel.DomainServices.Hosting 네임스페이스에는 이전 예제에 나와 있는 JsonEndpointFactory와 같이 RIA Services 도구 키트로 지원되는 끝점이 포함되어 있습니다. 사용자 지정 끝점을 만들려면 DomainServiceEndpointFactory 클래스에서 파생되는 클래스를 만들고 CreateEndpoints 메서드를 재정의해야 합니다.

데이터 작업

노출할 데이터 작업을 수행하는 도메인 서비스에 메서드를 추가합니다. 예를 들어 다음 작업을 수행하는 메서드를 추가할 수 있습니다.

  • Query

  • Update

  • Insert

  • Delete

다음과 같은 더 복잡한 작업도 추가할 수 있습니다.

  • Invoke: 추적 또는 지연된 실행 없이 실행해야 하는 작업을 구현하는 데 사용됩니다. 이 메서드는 엔터티가 아닌 데이터에만 사용되며 쿼리, 업데이트, 삽입 또는 삭제 작업을 대신 사용할 수 없을 때만 사용됩니다.

  • Named Update: 간단한 수정 작업에 속하지 않는 사용자 지정 작업을 구현하는 데 사용됩니다.

도메인 서비스를 노출할 때 EntitySet 개체는 클라이언트에서 허용되는 작업(삽입, 업데이트 또는 삭제)을 나타내는 속성을 사용하여 도메인 컨텍스트에서 생성됩니다. 엔터티 컬렉션을 수정한 다음 SubmitChanges 메서드를 호출하여 데이터 수정을 실행합니다.

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

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

규칙

작업을 수행하는 메서드를 추가하는 경우 메서드가 해당 작업에 대한 예상 시그니처와 일치해야 합니다. 시그니처가 일치해야 할 뿐만 아니라 해당 데이터 작업에 대한 명명 규칙과 일치하는 이름 접두사가 메서드에 포함되어야 합니다. 메서드의 이름이 예상되는 접두사로 시작되지 않으면 해당 작업에 대한 적절한 특성을 적용해야 합니다. 작업의 이름이 명명 규칙과 일치하는 경우 이 특성은 선택 사항입니다. 명명 규칙을 사용하면 개발자에게 보다 일관성 있는 환경을 제공할 수 있습니다.

도메인 작업인 메서드를 오버로드할 수 없습니다. 클라이언트 프로젝트에서 호출할 수 있는 각 메서드에 대한 고유 이름을 지정해야 합니다. 도메인 서비스 작업을 나타내는 모든 메서드는 public 메서드여야 합니다. 이러한 메서드는 매개 변수와 반환 형식에 serialize 가능한 형식을 사용해야 합니다.

IgnoreAttribute 특성을 메서드에 추가하여 메서드가 노출되지 않도록 할 수 있습니다.

데이터 작업 시그니처가 다음 표에 나와 있습니다.

쿼리

쿼리 메서드는 엔터티의 단일 인스턴스나 IEnumerable 또는 IQueryable(T는 유효한 엔터티 형식임)을 반환해야 합니다. 오버로드된 메서드가 허용되지 않기 때문에 다른 입력 매개 변수를 사용하는 각 메서드(예: GetEmployees()GetEmployeesByLastName(string lastname))에 고유 이름을 제공해야 합니다.

다음 표에는 쿼리 작업에 대한 예상 시그니처 값이 나와 있습니다.

반환 값

IEnumerable<T>, IQueryable<T> 또는 엔터티

매개 변수

임의의 수의 매개 변수

이름 접두사

임의의 이름

특성

[Query](C#)

-또는-

<Query()>(Visual Basic)

자세한 내용은 QueryAttribute를 참조하십시오.

예제

public IQueryable<Product> GetProducts()(C#)

-또는-

Public Function GetProducts() As IQueryable(Of Product)(Visual Basic)

업데이트

다음 표에는 업데이트 작업에 대한 예상 시그니처 값이 나와 있습니다.

반환 값

없음

매개 변수

엔터티

이름 접두사

Update, Change 또는 Modify

특성

[Update](C#)

-또는-

<Update()>(Visual Basic)

자세한 내용은 UpdateAttribute를 참조하십시오.

예제

public void UpdateProduct(Product product)(C#)

-또는-

Public Sub UpdateProduct(ByVal product As Product)(Visual Basic)

삽입

다음 표에는 삽입 작업에 대한 예상 시그니처 값이 나와 있습니다.

반환 값

없음

매개 변수

엔터티

이름 접두사

Insert, Add 또는 Create

특성

[Insert](C#)

-또는-

<Insert()>(Visual Basic)

자세한 내용은 InsertAttribute를 참조하십시오.

예제

public void InsertProduct(Product product)(C#)

-또는-

Public Sub InsertProduct(ByVal product As Product)(Visual Basic)

삭제

다음 표에는 삭제 작업에 대한 예상 시그니처 값이 나와 있습니다.

반환 값

없음

매개 변수

엔터티

이름 접두사

Delete 또는 Remove

특성

[Delete](C#)

-또는-

<Delete()>(Visual Basic)

자세한 내용은 DeleteAttribute를 참조하십시오.

예제

public void DeleteProduct(Product product)(C#)

-또는-

Public Sub DeleteProduct(ByVal product As Product)(Visual Basic)

Invoke

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

다음 표에는 호출 작업에 대한 예상 시그니처 값이 나와 있습니다.

반환 값

임의의 값

매개 변수

임의의 수의 매개 변수

이름 접두사

임의의 값

특성

[Invoke](C#)

-또는-

<Invoke>(Visual Basic)

자세한 내용은 InvokeAttribute를 참조하십시오.

예제

[Invoke]

public decimal GetCompetitorsPrice(Product product)(C#)

-또는-

<Invoke> _

Public GetCompetitorsPrice(ByVal product As Product) As Decimal(Visual Basic)

명명된 업데이트

다음 표에는 명명된 업데이트 작업에 대한 예상 시그니처 값이 나와 있습니다.

반환 값

없음

매개 변수

엔터티

임의의 수의 매개 변수

이름 접두사

Insert, Update 또는 Delete에 대한 접두사로 시작하는 이름을 제외한 임의의 이름

특성

[Update(UsingCustomMethod=true](C#)

-또는-

<Update(UsingCustomMethod:=True)>(Visual Basic)

자세한 내용은 UpdateAttribute를 참조하십시오.

예제

[Update(UsingCustomMethod=true]

public void DiscountProduct(Product product, int percentage)(C#)

-또는-

<Update(UsingCustomMethod:=True)> _

Public Sub DiscountProduct(ByVal product As Product, ByVal percentage As Integer)(Visual Basic)

도메인 서비스에 응용 프로그램 논리 추가

노출된 데이터 작업을 정의한 후 필요한 응용 프로그램 논리를 도메인 서비스 클래스에 추가할 수 있습니다. 마법사로 생성된 코드는 응용 프로그램 논리 작성을 시작하는 데 도움을 주기 위한 것일 뿐입니다. 작업 메서드에 직접 논리를 추가하거나 작업 메서드에서 호출되는 메서드에 논리를 추가할 수 있습니다. 기존 메서드에 매개 변수를 추가하거나, 메서드 구현을 사용자 지정하거나, 새 메서드를 추가하여 응용 프로그램에 필요한 기능을 제공할 수 있습니다. 비즈니스 논리 구현에 대한 자세한 내용은 방법: 도메인 서비스 비즈니스 논리 추가를 참조하십시오.

도메인 서비스를 구현할 때 서비스를 통해 데이터를 노출하는 경우의 보안 위험을 신중하게 고려해야 합니다. 보안에 대한 자세한 내용은 WCF RIA Services 보안을 참조하십시오.

참고 항목

개념

DomainContext 및 작업
WCF RIA Services 보안