다음을 통해 공유


클라이언트 코드 생성

WCF RIA Services를 사용하여 Silverlight 속성과 중간 계층 프로젝트를 연결하면 RIA Services 에서는 중간 계층에서 노출한 엔터티와 작업을 기반으로 클라이언트 응용 프로그램을 위한 클라이언트 프록시 클래스를 생성합니다. RIA Services 에서 이러한 클래스가 생성되기 때문에 중간 계층에서 프레젠테이션 계층으로 응용 프로그램 논리를 복제할 필요가 없습니다. 클라이언트 프로젝트를 다시 빌드할 때 중간 계층 코드에서 변경한 모든 내용이 프레젠테이션 계층 코드와 동기화됩니다. RIA Services 링크를 솔루션에 추가하면 클라이언트 프로젝트에 대한 코드를 생성하기 전에 서버 프로젝트를 강제로 빌드하는 솔루션에 명시적 빌드 종속성이 추가됩니다.

생성된 코드는 클라이언트 프로젝트의 Generated_Code라는 폴더에 있습니다. 이 폴더를 보려면 클라이언트 프로젝트의 솔루션 탐색기 창에서 모든 파일 표시를 선택해야 합니다. 클라이언트 프로젝트를 다시 빌드할 때 Generated_Code의 클래스를 덮어쓰기 때문에 이 폴더에서 클래스를 직접 수정하면 안 됩니다. 그러나 생성된 파일을 열어 클라이언트 프로젝트에서 사용할 수 있는 코드를 볼 수는 있습니다.

RIA_GeneratedCode

클라이언트 코드를 생성하는 알고리즘은 다음과 같은 기본 규칙을 따릅니다.

  1. 도메인 서비스 클래스, 엔터티 클래스 또는 공유 코드에 대해 중간 계층 프로젝트에서 빌드하거나 참조하는 모든 어셈블리를 분석합니다.

  2. EnableClientAccessAttribute 특성으로 주석이 달린 각 도메인 서비스에 대해 DomainContext 클래스에서 파생되는 클래스를 생성합니다.

  3. 도메인 서비스 클래스의 각 쿼리 메서드, 명명된 업데이트 메서드(UsingCustomMethod 속성이 true로 설정된 업데이트 메서드) 또는 호출 작업에 대해 도메인 컨텍스트 클래스에 메서드를 생성합니다.

  4. 도메인 서비스에 의해 노출되는 각 엔터티 클래스에 대해 엔터티 프록시 클래스를 생성합니다. 엔터티 클래스는 query 메서드에서 반환될 때 노출됩니다.

  5. 공유하도록 표시된 코드를 클라이언트 프로젝트에 복사합니다.

다음 이미지에서는 중간 계층 프로젝트에 대해 생성되는 클라이언트 코드를 보여 줍니다.

클라이언트 코드 생성

DomainService 및 DomainContext

DomainContext에서 파생되는 한 클래스는 다음 규칙에 따라 각 도메인 서비스 클래스에 대해 생성됩니다.

  1. 도메인 서비스와 동일한 네임스페이스로 도메인 컨텍스트 클래스가 생성됩니다.

  2. 도메인 컨텍스트 클래스에는 다음과 같은 세 가지 생성자가 들어 있습니다.

    1. WebDomainClient 클래스를 사용하여 http를 통해 도메인 서비스와 통신하는 데 필요한 URI를 포함하는 기본 생성자

    2. 클라이언트에서 대체 URI를 지정하도록 허용하는 생성자

    3. 클라이언트에서 사용자 지정 DomainClient 구현을 제공하도록 허용하는 생성자(대개 단위 테스트 또는 사용자 지정 전송 계층으로 리디렉션에 사용됨)

  3. 도메인 서비스 클래스의 각 query 메서드에 대해 클라이언트 프로젝트에서 엔터티를 로드하는 데 사용할 수 있는 EntityQuery 메서드를 생성합니다.

  4. 각 호출 작업에 대해 작업을 비동기적으로 호출하는 데 사용할 수 있는 해당 InvokeOperation 메서드를 생성합니다.

  5. Update(UsingCustomMethod=true) 특성으로 표시된 각 메서드에 대해 해당 메서드를 호출하고 호출 여부를 확인하는 메서드를 생성합니다.

  6. 도메인 서비스에서 삽입, 업데이트 또는 삭제를 수행하는 public 메서드를 사용하면 도메인 컨텍스트의 생성된 EntityContainer가 클라이언트에서 허용되는 작업을 표시하는 EntitySetOperations 플래그와 함께 만들어집니다.

엔터티 클래스 및 엔터티 프록시 클래스

엔터티 프록시 클래스를 생성할 때는 다음 규칙이 적용됩니다.

  1. 중간 계층의 엔터티 클래스와 동일한 이름과 네임스페이스로 프록시 클래스가 생성됩니다.

  2. 루트 엔터티 형식은 엔터티 클래스에서 파생됩니다. 파생된 엔터티 형식은 중간 계층에서 노출된 해당 기본 형식에서 파생됩니다.

  3. 지원되는 형식을 포함하고 엔터티 클래스에서 ExcludeAttribute 특성으로 표시되지 않는 모든 public 속성은 클라이언트 프로젝트에 없는 경우 프록시 클래스에서 생성됩니다. 자세한 내용은 이 항목 뒷부분의 “중복 멤버 방지” 단원을 참조하십시오. Object는 지원되는 형식이 아닙니다.

  4. 각 속성 setter에는 유효성 검사를 수행하여 속성이 변경 중이거나 변경되었음을 클라이언트에 알리는 코드가 포함됩니다.

  5. 메타데이터 특성은 생성된 코드의 엔터티 클래스와 결합됩니다. 클라이언트에는 메타데이터 클래스가 없습니다.

  6. 가능한 경우 사용자 지정 특성이 프록시 클래스에 전파됩니다. 클라이언트 프로젝트에 사용자 지정 특성이 존재하기 위한 조건에 대한 설명은 다음 “사용자 지정 특성” 단원을 참조하십시오.

멤버에 대한 여러 CustomValidationAttribute 인스턴스에 동일한 형식과 유효성 검사 메서드가 지정된 경우 하나의 CustomValidationAttribute만 멤버에게 전파됩니다.

사용자 지정 특성

사용자 지정 특성 추가로 인해 클라이언트 프로젝트에서 컴파일 오류가 발생하지 않으면 해당 사용자 지정 특성이 프록시 클래스로 전파됩니다. 사용자 지정 특성이 전파되려면 다음 조건이 충족되어야 합니다.

  1. 사용자 지정 특성 형식을 클라이언트 프로젝트에서 사용할 수 있어야 합니다.

  2. 사용자 지정 특성 선언에 지정된 모든 형식을 클라이언트 프로젝트에서 사용할 수 있어야 합니다.

  3. 사용자 지정 특성 형식이 모든 해당 속성에 대해 public setter를 노출하거나 public setter가 없는 속성을 설정할 수 있게 하는 생성자를 노출해야 합니다.

필수 사용자 지정 특성이 클라이언트에 전파되지 않으면 클라이언트 프로젝트에서 어셈블리 참조를 추가해야 할 수 있습니다. 클라이언트 프로젝트에서 사용자 지정 특성을 컴파일하는 데 필요한 어셈블리에 대한 참조를 추가합니다. 공유 파일에서 사용자 지정 특성을 정의하여 계층 간에 사용자 지정 특성을 공유할 수도 있습니다.

공유 코드

중간 계층과 프레젠테이션 계층 간에 코드 파일을 공유하면 클라이언트 프로젝트 변경 없이 코드가 복사됩니다. *.shared.cs 또는 *.shared.vb 패턴으로 파일 이름을 지정하여 공유할 파일을 지정합니다. 공유 파일을 포함하는 중간 계층 프로젝트의 디렉터리 구조는 Generated_Code 폴더에 복제됩니다.

공유 코드 파일에 사용자 지정 형식을 추가한 다음 호출 작업에서 해당 형식을 반환하면 도메인 컨텍스트의 생성된 메서드가 사용자 지정 형식을 반환하지 않습니다. 대신 도메인 컨텍스트의 메서드가 프레임워크에 속하는 형식을 반환합니다. 예를 들어, IDictionary를 구현하는 MyCustomDictionary라는 사용자 지정 형식을 만들고 해당 형식을 도메인 작업에 대한 반환 값으로 지정하면 도메인 컨텍스트에서 생성된 메서드가 MyCustomDictionary를 반환하지 않습니다. 대신 이 메서드는 Dictionary 개체를 반환합니다.

자세한 내용은 공유 코드를 참조하십시오.

중복 멤버 방지

엔터티 프록시 클래스를 생성할 때 부분 형식(Partial Type)을 사용하여 클라이언트 프로젝트에 동일한 형식과 멤버가 이미 정의되어 있을 수 있습니다. 공유 코드 또는 클라이언트 프로젝트에만 있는 코드에서 멤버를 정의했을 수 있습니다. RIA Services 는 프록시 클래스를 생성하기 전에 기존 멤버를 확인합니다. 이미 정의된 멤버는 프록시 클래스에서 생성되지 않습니다.

참고 항목

개념

도메인 서비스
공유 코드
데이터