다음을 통해 공유


방법: POCO로 정의된 엔터티를 사용하는 도메인 서비스 만들기

이 항목에서는 WCF RIA Services를 사용하여 POCO(Plain Old CLR Objects)를 사용하는 도메인 서비스를 만드는 방법에 대해 설명합니다. 여기에서는 특히 절차의 여러 단계를 진행하는 동안 RIA Services 도구(마법사 및 대화 상자)를 사용하여 매우 기본적인 POCO 기반 RIA Services 응용 프로그램을 생성하는 방법을 설명합니다. POCO에서 제공되는 데이터를 사용하면 이식성 또는 데이터 보안을 위해 또는 테스트 용도로 백 엔드 데이터베이스에 대한 응용 프로그램의 종속성을 없앨 수 있습니다. 자동으로 생성되는 클라이언트 코드는 Linq to SQL 또는 Linq to Entity Framework와 마찬가지로 POCO에서 정의된 엔터티에 대해 완전한 RIA Services 지원이 제공됩니다. RIA Services 도메인 서비스는 실제로 데이터 원본이 무엇인지 알 수 없으므로 이 POCO 클래스는 나중에 도메인 서비스 자체를 변경하지 않고 데이터베이스와 같은 다른 원본으로부터 데이터를 액세스하는 구성 요소에 의해 교체될 수 있습니다.

여기에 설명된 절차를 수행하려면 WCF RIA Services 외에도 Visual Studio 2010 및 Silverlight Developer 런타임 및 SDK와 같은 필수 구성 요소 프로그램이 올바르게 설치 및 구성되어 있어야 합니다. 하지만 WCF RIA Services Toolkit은 필요하지 않습니다. 이러한 각 필수 구성 요소를 충족하기 위한 자세한 지침은 WCF RIA Services의 사전 요구 사항 노드의 항목에서 제공합니다. 가능한 한 문제를 최소화하려면 이 방법을 진행하기 전에 필요한 프로그램에 대해 제공된 지침을 따르십시오.

RIA Services 솔루션 만들기

  1. 파일, 새로 만들기, 프로젝트를 차례로 선택하여 Visual Studio 2010에서 새 RIA Services 프로젝트를 만듭니다.

    새 프로젝트 대화 상자가 나타납니다.

  2. 설치된 템플릿Silverlight 그룹에서 Silverlight 응용 프로그램 템플릿을 선택하고 새 프로젝트의 이름을 RIAServicesPocoExample로 지정합니다.

  3. 확인을 클릭합니다.

    새 Silverlight 응용 프로그램 대화 상자가 나타납니다.

  4. 대화 상자 아래쪽에서 WCF RIA Services 사용 확인란을 선택합니다. 이 확인란을 선택하면 클라이언트 프로젝트와 서버 프로젝트 간에 RIA Services 링크가 만들어집니다. 이 연결을 사용하기 위해 이 도구는 클라이언트 프로젝트에 다음과 같은 참조를 추가합니다.

    • System.ComponentModel.DataAnnotations

    • System.Runtime.Serialization

    • System.ServiceModel.dll

    • System.ServiceModel.DomainServices.Client

    • System.ServiceModel.DomainServices.Client.Web

    • System.ServiceModel.Web.Extensions

    • System.Windows.Browser

  5. 확인을 클릭하여 솔루션을 만듭니다.

    솔루션에는 클라이언트 프로젝트와 서버 프로젝트가 포함됩니다.

    • RIAServicesPocoExample: 프레젠테이션 계층을 만들기 위해 사용하는 Silverlight 코드가 포함된 클라이언트 프로젝트입니다.

    • RIAServicesPocoExample.Web: 중간 계층 코드가 포함된 서버 프로젝트입니다.

도메인 서비스 만들기

  1. 서버 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가새 항목을 선택합니다.

  2. 범주 목록에서 을 선택한 다음 도메인 서비스 클래스 템플릿을 선택합니다.

  3. 클래스의 이름을 SovereignDomainService.cs(또는 SovereignDomainService.vb)로 지정합니다.

  4. 추가를 클릭합니다.

    새 도메인 서비스 클래스 추가 대화 상자가 나타납니다.

  5. 클라이언트 액세스 사용 확인란이 선택되어 있는지 확인합니다.

  6. 사용 가능한 DataContext/ObjectContext 클래스의 드롭다운 메뉴에서 제공되는 유일한 옵션은 <빈 도메인 서비스 클래스> 엔터티이며, 서비스와 연결하는 데 사용할 수 있는 데이터 컨텍스트가 없기 때문에 메타데이터에 대한 연결된 클래스 생성 확인란을 선택할 수 없습니다.

  7. 확인을 클릭합니다.

    이 마법사는 몇 가지 작업을 수행합니다. 마법사는 연결된 특성 및 using 문을 사용하여 새 SovereignDomainService.cs(또는 SovereignDomainService.vb) 파일에 빈 SovereignDomainService 클래스를 생성합니다. 또한 서비스 프로젝트에 네 개의 어셈블리 참조를 추가하고 Web.config 파일에 구성 요소를 추가합니다.

  8. 이를 확인하려면 SovereignDomainService.cs(또는 SovereignDomainService.vb) 파일이 자동으로 열리지 않은 경우 파일을 엽니다. 이 파일의 특징은 다음과 같습니다.

    1. using 문이 추가됨:

      • using System;

      • using System.Collections.Generic;

      • using System.ComponentModel;

      • using System.ComponentModel.DataAnnotations;

      • using System.Linq;

      • using System.ServiceModel.DomainServices.Hosting;

      • using System.ServiceModel.DomainServices.Server

    2. SovereignDomainService 클래스가 RIA Services 프레임워크의 추상 기본 클래스인 DomainService 클래스에서 파생됩니다. 이 클래스는 RIA Services 에 제공된 모든 도메인 서비스에 대한 기본 클래스입니다.

    3. SovereignDomainService 클래스는 EnableClientAccessAttribute 특성으로 표시되어 클라이언트 계층에 표시됨을 나타냅니다.

  9. 다음 참조가 마법사에서 서비스 프로젝트에 추가되었습니다.

    • System.ComponentModel.DataAnnotations

    • System.Runtime.Serialization

    • System.ServiceModel.DomainServices.Hosting

    • System.ServiceModel.DomainServices.Server

  10. 마지막으로 Web.config 파일을 열고 마법사에서 추가한 새 요소를 검사합니다.

    <configuration>
        <system.webServer>
            <modules runAllManagedModulesForAllRequests="true">
                <add name="DomainServiceModule" preCondition="managedHandler"
                    type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            </modules>
            <validation validateIntegratedModeConfiguration="false" />
        </system.webServer>
        <system.web>
            <httpModules>
                <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            </httpModules>
            <compilation debug="true" targetFramework="4.0" />
        </system.web>
    
        <system.serviceModel>
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                multipleSiteBindingsEnabled="true" />
        </system.serviceModel>
    </configuration>
    

    .NET Framework 4.0이 대상으로 지정된 구성 요소를 제외하고는 이러한 각 요소가 새 도메인 서비스 클래스 추가 대화 상자로 추가됩니다. 이러한 요소는 다양한 IIS(인터넷 정보 서버) 호스팅 및 ASP.NET 옵션을 지원합니다.

    1. 마법사가 IIS 7 호스팅에 필요한 <modules> 요소를 <system.webserver> 섹션에 추가합니다.

    2. 마법사가 system.web 섹션 내에서 IIS 6 호스팅에 필요한 <httpModules> 요소의 <add> 요소를 추가합니다.

    3. RIA Services 도메인 서비스는 WCF(Windows Communication Foundation) 서비스이며 ASP.NET으로 호스팅될 때 ASP.NET 호환 모드로 호스팅되어야 합니다. 이 요구 사항은 코드로 설정할 수 없으며 Web.config 파일에서 지정해야 합니다. ASP.NET 호환 모드는 <system.serviceModel> 섹션의 <ServiceHostingEnvironment> 요소에서 aspNetCompatibilityEnabled 속성을 true로 설정하여 활성화됩니다.

POCO 클래스 추가

  1. 이 절차에서는 POCO 클래스를 엔터티 형식으로 사용하기 위해 RIA Services 프레임워크를 지정하는 방법에 대해 설명합니다. 엔터티 형식은 응용 프로그램의 데이터 모델에 대한 데이터 구조를 제공하고 각 엔터티 형식은 고유한 엔터티 키를 가져야 합니다. 데이터 구조체는 포함된 속성 집합에 의해 지정됩니다. 엔터티 키는 동일 형식의 다른 엔터티와 구분하기 위해 각 엔터티 개체에 대해 고유한 이름을 제공해야 하는 속성(또는 속성 집합)을 대신 적용하여 제공됩니다. 이러한 속성은 일반적으로 다양한 메타데이터를 사용하여 지정됩니다. 이 절차에서는 이를 위해 한 속성에 [Key] 특성을 적용합니다. 실제로 이 특성을 적용한다는 것은 RIA Services 프레임워크에 POCO 클래스의 인스턴스가 엔터티 개체임을 알리는 것과 같습니다.

  2. SovereignDomainSevice.cs 파일을 엽니다.

  3. RIAServicesPocoExample.Web 네임스페이스 범위 내에서 스텁 해제된 SovereignDomainService 클래스 아래에 Sovereign 클래스에 대한 다음 코드를 추가합니다.

    
    public class Sovereign
        {
            [Key]
            public int UniqueId { get; set; }
            public string Name { get; set; }
            public string House { get; set; }
            public string Dominion { get; set; }
            public int ReignStart { get; set; }
            public int ReignEnd { get; set; }
            public string Sobriquet { get; set; }
        }
    
  4. 이 예에서 UniqueId 속성은 Sovereign 형식의 각 엔터티 개체에 대한 고유 이름을 제공하는 엔터티 키입니다. [Key] 특성은 System.ComponentModel.DataAnnotations 어셈블리에 정의됩니다. 이 어셈블리는 특성을 포함하는 해당 네임스페이스에 대한 using 문이 포함되었으므로 이미 서버 프로젝트에 추가된 상태입니다. 엔터티 키는 메타데이터 파일 또는 다른 방식으로 지정할 수도 있지만 POCO 클래스에 직접 지정하는 것이 편리합니다.

  5. Sovereign 인스턴스 목록을 반환하는 FetchSovereigns() 메서드를 Sovereign 클래스에 추가합니다.

    
    public List<Sovereign> FetchSovereigns()
            {
                List<Sovereign> sovereignList = new List<Sovereign>
                {
                new Sovereign()
                    {UniqueId = 1, 
                     Name = "John", 
                     House = "Plantagenet", 
                     Dominion = "Angevin Empire", 
                     ReignStart = 1167, 
                     ReignEnd = 1216, 
                     Sobriquet = "Lackland"
                    },
                new Sovereign()
                    {UniqueId = 2, 
                     Name = "Charles", 
                     House = "Stuart", 
                     Dominion = "England, Scotland, & Ireland", 
                     ReignStart = 1625, 
                     ReignEnd = 1649, 
                     Sobriquet = "The Martyr"
                    },
                new Sovereign()
                    {UniqueId = 3, 
                     Name = "William", 
                     House = "Dunkeld", 
                     Dominion = "Scotland", 
                     ReignStart = 1165, 
                     ReignEnd = 1249, 
                     Sobriquet = "The Lion"
                    },   
                new Sovereign()
                    {UniqueId = 4, 
                     Name = "Elizabeth", 
                     House = "Tudor", 
                     Dominion = "England", 
                     ReignStart = 1555, 
                     ReignEnd = 1609, 
                     Sobriquet = "The Virgin Queen"
                    },
                new Sovereign()
                    {UniqueId = 5, 
                     Name = "Ivan", 
                     House = "Vasilyevich", 
                     Dominion = "Russia", 
                     ReignStart = 1533, 
                     ReignEnd = 1584, 
                     Sobriquet = "The Terrible"
                    },
                new Sovereign()
                    {UniqueId = 6, 
                     Name = "Charles", 
                     House = "Valois", 
                     Dominion = "France", 
                     ReignStart = 1380, 
                     ReignEnd = 1422, 
                     Sobriquet = "The Mad"
                    }
                };
            return sovereignList;
            }
    

도메인 서비스 정의

  1. 이 절차에서는 POCO로 정의된 엔터티에서 데이터를 검색하기 위해 클라이언트에서 액세스할 수 있는 도메인 서비스에서 쿼리를 만드는 방법을 설명합니다. RIA Services 프레임워크는 클라이언트에서 쿼리로 사용할 수 있는 메서드를 알고 있어야 하며 이를 위해 사용되는 명명 규칙이 있습니다. Get으로 시작되고 IEnumerable<EntityType> 또는 IQueryable<EntityType>을 반환하는 메서드 이름은 RIA Services 프레임워크에서 쿼리로 인식됩니다.

    Tip팁:
    IQueryableIEnumerable로부터 파생됩니다. POCO로 정의된 엔터티와 같은 메모리 내 컬렉션에 대해 IEnumerable을 사용하고 SQL 데이터베이스와 같은 기본 또는 원격 데이터 원본을 액세스할 때 IQueryable을 사용합니다.
  2. SovereignDomainService 클래스에 GetSovereign() 메서드를 추가합니다.

    
            public IEnumerable<Sovereign> GetSovereigns()
            { 
                Sovereign sovereign = new Sovereign();
                return sovereign.FetchSovereigns();
            }
    
  3. 이렇게 하면 컬렉션으로부터 모든 sovereign 엔터티가 반환됩니다. 하지만 일반적으로는 엔터티의 하위 집합만 반환하면 됩니다. 이를 위해 중세 시대 중에 통치했던 통치자(sovereign)만 이 목록에서 반환하도록 쿼리를 수정합니다. 즉 sovereign.ReignEnd<= 1500입니다. 다음 코드에서 이를 수행합니다.

            public IEnumerable<Sovereign> GetSovereignsByReignEnd(int ReignedBefore)
            {
                Sovereign sovereign = new Sovereign();
                return sovereign.FetchSovereigns().Where<Sovereign>(p => p.ReignEnd <= 1500);
            }
    
  4. 솔루션을 빌드(Ctrl+Shift+B)하여 자동 생성되는 클라이언트 프록시 코드를 만듭니다.

  5. 솔루션 탐색기에서 RIAServicesPocoExample 클라이언트 프로젝트를 선택하고 창 위에 있는 모든 파일 표시 아이콘을 클릭하고 Generated_Code 폴더에 있는 RIAServicesPocoExample.Web.g.cs 파일을 검사합니다. 이 파일에서 자동 생성된 코드를 검사하고 다음 항목들을 확인합니다.

    • WebContextBase 클래스로부터 파생되는 WebContext 클래스가 생성되고 응용 프로그램 컨텍스트를 관리하는 데 사용됩니다.

    • Entity 클래스에서 파생되는 Sovereign 클래스가 도메인 서비스에서 제공되는 엔터티에 대해 생성됩니다. 클라이언트 프로젝트의 Sovereign 엔터티 클래스는 서버의 Sovereign 엔터티와 일치합니다.

    • DomainContext 클래스에서 파생되는 SovereignDomainContext 클래스가 생성됩니다. 이 클래스에는 도메인 서비스에서 만들어진 쿼리 메서드에 해당하는 GetSovereignsByReignEndQuery라는 메서드가 있습니다.

  6. 자동 코드 생성에 대한 자세한 내용은 클라이언트 코드 생성 항목을 참조하십시오. 코드 생성을 사용자 지정하는 방법에 대한 자세한 내용은 생성된 코드 사용자 지정 항목을 참조하십시오.

Silverlight 클라이언트에 쿼리 결과 표시

  1. MainPage.xaml을 엽니다.

  2. 왼쪽의 도구 상자에서 XAML 뷰의 Grid 요소 안으로 DataGrid 컨트롤을 끌어 옵니다.

    도구 상자에서 DataGrid 컨트롤을 끌어 오면 네임스페이스 using System.Windows.Controls 문이 MainPage.xaml.cs 파일에 추가되고 System.Windows.Controls.Data 및 System.Windows.Controls.Data.Input 어셈블리에 대한 참조가 클라이언트 프로젝트에 자동으로 추가됩니다.

    Caution주의:
    도구 상자에서 끌어 오지 않고 DataGrid를 추가하는 경우 코드 숨김 파일에서 수동으로 using 문을 추가하고 어셈블리에 대한 참조를 클라이언트 프로젝트에 추가해야 합니다.
  3. 다음 XAML과 같이 AutoGeneratedColums 값을 True로 변경하고 DataGrid 요소의 이름을 SovereignGrid로 지정한 다음 HeightWidth를 조정합니다.

    
    <Grid x:Name="LayoutRoot" Background="White">
         <sdk:DataGrid AutoGenerateColumns="True" 
                       Height="200" 
                       HorizontalAlignment="Left" 
                       Margin="157,86,0,0" 
                       Name="SovereignGrid" 
                       VerticalAlignment="Top"
                       Width="600" />
    </Grid>
    
  4. MainPage.xaml.cs 파일을 엽니다.

  5. using RIAServicesPocoExample.Web; 문 및 using System.ServiceModel.DomainServices.Client; 문에 using(C#) 또는 Imports(Visual Basic)를 추가합니다.

    RIAServicesPocoExample.Web 네임스페이스는 RIAServicesPocoExample.Web.g.cs(또는 RIAServicesPocoExample.Web.g.vb)에서 클라이언트 프로젝트에 대해 생성된 코드를 포함하는 네임스페이스입니다.

  6. SovereignDomainContext를 인스턴스화하려면 MainPage 클래스에서 private SovereignDomainContext _sovereignContext = new SovereignDomainContext(); 코드 줄을 추가합니다.

  7. LoadOperation을 사용하여 GetSovereignsQuery 메서드를 호출하는 방법으로 고객 엔터티를 검색합니다(LoadOperation<Sovereign> loadOp = this._sovereignContext.Load(this._sovereignContext.GetSovereignsByReignEndQuery(1500));).

  8. SovereignGrid.ItemsSource = loadOp.Entities;를 사용하여 DataGrid에 로드된 엔터티를 바인딩합니다.

    요약하면 이제 MainPage.xaml.cs 파일에 다음과 같은 코드가 포함됩니다.

    //Namespaces added
    using RIAServicesPocoExample.Web;
    using System.ServiceModel.DomainServices.Client;
    
    namespace RIAServicesPocoExample
    {
        public partial class MainPage : UserControl
    
        {
            private SovereignDomainContext _sovereignContext = new SovereignDomainContext();
    
            public MainPage()
            {
    
                InitializeComponent();
    
                  LoadOperation<Sovereign> loadOp = this._sovereignContext.Load(this._sovereignContext.GetSovereignsByReignEndQuery(1500));
                  SovereignGrid.ItemsSource = loadOp.Entities;
            }
        }
    }
    
  9. F5 키를 눌러 응용 프로그램을 실행합니다.

    중세 시대(통치 기간이 1500년대 이전에 끝나는) 통치자(알파벳 순서)의 속성만 표시된 테이블이 브라우저에 표시됩니다.

보안

참고 항목

작업

연습: 도메인 서비스에서 데이터 검색 및 표시

개념

클라이언트 코드 생성