방법: 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 솔루션 만들기
-
파일, 새로 만들기, 프로젝트를 차례로 선택하여 Visual Studio 2010에서 새 RIA Services 프로젝트를 만듭니다.
새 프로젝트 대화 상자가 나타납니다.
-
설치된 템플릿의 Silverlight 그룹에서 Silverlight 응용 프로그램 템플릿을 선택하고 새 프로젝트의 이름을 RIAServicesPocoExample로 지정합니다.
-
확인을 클릭합니다.
새 Silverlight 응용 프로그램 대화 상자가 나타납니다.
-
대화 상자 아래쪽에서 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
-
System.ComponentModel.DataAnnotations
-
확인을 클릭하여 솔루션을 만듭니다.
솔루션에는 클라이언트 프로젝트와 서버 프로젝트가 포함됩니다.
-
RIAServicesPocoExample: 프레젠테이션 계층을 만들기 위해 사용하는 Silverlight 코드가 포함된 클라이언트 프로젝트입니다.
-
RIAServicesPocoExample.Web: 중간 계층 코드가 포함된 서버 프로젝트입니다.
-
RIAServicesPocoExample: 프레젠테이션 계층을 만들기 위해 사용하는 Silverlight 코드가 포함된 클라이언트 프로젝트입니다.
도메인 서비스 만들기
-
서버 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가 및 새 항목을 선택합니다.
-
범주 목록에서 웹을 선택한 다음 도메인 서비스 클래스 템플릿을 선택합니다.
-
클래스의 이름을 SovereignDomainService.cs(또는 SovereignDomainService.vb)로 지정합니다.
-
추가를 클릭합니다.
새 도메인 서비스 클래스 추가 대화 상자가 나타납니다.
-
클라이언트 액세스 사용 확인란이 선택되어 있는지 확인합니다.
-
사용 가능한 DataContext/ObjectContext 클래스의 드롭다운 메뉴에서 제공되는 유일한 옵션은 <빈 도메인 서비스 클래스> 엔터티이며, 서비스와 연결하는 데 사용할 수 있는 데이터 컨텍스트가 없기 때문에 메타데이터에 대한 연결된 클래스 생성 확인란을 선택할 수 없습니다.
-
확인을 클릭합니다.
이 마법사는 몇 가지 작업을 수행합니다. 마법사는 연결된 특성 및
using문을 사용하여 새 SovereignDomainService.cs(또는 SovereignDomainService.vb) 파일에 빈SovereignDomainService클래스를 생성합니다. 또한 서비스 프로젝트에 네 개의 어셈블리 참조를 추가하고 Web.config 파일에 구성 요소를 추가합니다. -
이를 확인하려면 SovereignDomainService.cs(또는 SovereignDomainService.vb) 파일이 자동으로 열리지 않은 경우 파일을 엽니다. 이 파일의 특징은 다음과 같습니다.
-
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
-
SovereignDomainService클래스가 RIA Services 프레임워크의 추상 기본 클래스인 DomainService 클래스에서 파생됩니다. 이 클래스는 RIA Services 에 제공된 모든 도메인 서비스에 대한 기본 클래스입니다. -
SovereignDomainService클래스는 EnableClientAccessAttribute 특성으로 표시되어 클라이언트 계층에 표시됨을 나타냅니다.
-
-
다음 참조가 마법사에서 서비스 프로젝트에 추가되었습니다.
-
System.ComponentModel.DataAnnotations
-
System.Runtime.Serialization
-
System.ServiceModel.DomainServices.Hosting
-
System.ServiceModel.DomainServices.Server
-
System.ComponentModel.DataAnnotations
-
마지막으로 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 옵션을 지원합니다.
-
마법사가 IIS 7 호스팅에 필요한
<modules>요소를<system.webserver>섹션에 추가합니다. -
마법사가
system.web섹션 내에서 IIS 6 호스팅에 필요한<httpModules>요소의<add>요소를 추가합니다. -
RIA Services
도메인 서비스는 WCF(Windows Communication Foundation) 서비스이며 ASP.NET으로 호스팅될 때 ASP.NET 호환 모드로 호스팅되어야 합니다. 이 요구 사항은 코드로 설정할 수 없으며 Web.config 파일에서 지정해야 합니다. ASP.NET 호환 모드는
<system.serviceModel>섹션의<ServiceHostingEnvironment>요소에서aspNetCompatibilityEnabled속성을 true로 설정하여 활성화됩니다.
-
마법사가 IIS 7 호스팅에 필요한
POCO 클래스 추가
-
이 절차에서는 POCO 클래스를 엔터티 형식으로 사용하기 위해 RIA Services 프레임워크를 지정하는 방법에 대해 설명합니다. 엔터티 형식은 응용 프로그램의 데이터 모델에 대한 데이터 구조를 제공하고 각 엔터티 형식은 고유한 엔터티 키를 가져야 합니다. 데이터 구조체는 포함된 속성 집합에 의해 지정됩니다. 엔터티 키는 동일 형식의 다른 엔터티와 구분하기 위해 각 엔터티 개체에 대해 고유한 이름을 제공해야 하는 속성(또는 속성 집합)을 대신 적용하여 제공됩니다. 이러한 속성은 일반적으로 다양한 메타데이터를 사용하여 지정됩니다. 이 절차에서는 이를 위해 한 속성에
[Key]특성을 적용합니다. 실제로 이 특성을 적용한다는 것은 RIA Services 프레임워크에 POCO 클래스의 인스턴스가 엔터티 개체임을 알리는 것과 같습니다. -
SovereignDomainSevice.cs 파일을 엽니다.
-
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; } } -
이 예에서
UniqueId속성은Sovereign형식의 각 엔터티 개체에 대한 고유 이름을 제공하는 엔터티 키입니다.[Key]특성은 System.ComponentModel.DataAnnotations 어셈블리에 정의됩니다. 이 어셈블리는 특성을 포함하는 해당 네임스페이스에 대한using문이 포함되었으므로 이미 서버 프로젝트에 추가된 상태입니다. 엔터티 키는 메타데이터 파일 또는 다른 방식으로 지정할 수도 있지만 POCO 클래스에 직접 지정하는 것이 편리합니다. -
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; }
도메인 서비스 정의
-
이 절차에서는 POCO로 정의된 엔터티에서 데이터를 검색하기 위해 클라이언트에서 액세스할 수 있는 도메인 서비스에서 쿼리를 만드는 방법을 설명합니다. RIA Services 프레임워크는 클라이언트에서 쿼리로 사용할 수 있는 메서드를 알고 있어야 하며 이를 위해 사용되는 명명 규칙이 있습니다.
Get으로 시작되고IEnumerable<EntityType>또는IQueryable<EntityType>을 반환하는 메서드 이름은 RIA Services 프레임워크에서 쿼리로 인식됩니다.
팁: IQueryable은 IEnumerable로부터 파생됩니다. POCO로 정의된 엔터티와 같은 메모리 내 컬렉션에 대해 IEnumerable을 사용하고 SQL 데이터베이스와 같은 기본 또는 원격 데이터 원본을 액세스할 때 IQueryable을 사용합니다. -
SovereignDomainService클래스에GetSovereign()메서드를 추가합니다.public IEnumerable<Sovereign> GetSovereigns() { Sovereign sovereign = new Sovereign(); return sovereign.FetchSovereigns(); } -
이렇게 하면 컬렉션으로부터 모든 sovereign 엔터티가 반환됩니다. 하지만 일반적으로는 엔터티의 하위 집합만 반환하면 됩니다. 이를 위해 중세 시대 중에 통치했던 통치자(sovereign)만 이 목록에서 반환하도록 쿼리를 수정합니다. 즉
sovereign.ReignEnd<= 1500입니다. 다음 코드에서 이를 수행합니다.public IEnumerable<Sovereign> GetSovereignsByReignEnd(int ReignedBefore) { Sovereign sovereign = new Sovereign(); return sovereign.FetchSovereigns().Where<Sovereign>(p => p.ReignEnd <= 1500); } -
솔루션을 빌드(Ctrl+Shift+B)하여 자동 생성되는 클라이언트 프록시 코드를 만듭니다.
-
솔루션 탐색기에서 RIAServicesPocoExample 클라이언트 프로젝트를 선택하고 창 위에 있는 모든 파일 표시 아이콘을 클릭하고 Generated_Code 폴더에 있는 RIAServicesPocoExample.Web.g.cs 파일을 검사합니다. 이 파일에서 자동 생성된 코드를 검사하고 다음 항목들을 확인합니다.
-
WebContextBase 클래스로부터 파생되는
WebContext클래스가 생성되고 응용 프로그램 컨텍스트를 관리하는 데 사용됩니다. -
Entity 클래스에서 파생되는
Sovereign클래스가 도메인 서비스에서 제공되는 엔터티에 대해 생성됩니다. 클라이언트 프로젝트의Sovereign엔터티 클래스는 서버의Sovereign엔터티와 일치합니다. -
DomainContext 클래스에서 파생되는
SovereignDomainContext클래스가 생성됩니다. 이 클래스에는 도메인 서비스에서 만들어진 쿼리 메서드에 해당하는GetSovereignsByReignEndQuery라는 메서드가 있습니다.
-
WebContextBase 클래스로부터 파생되는
-
자동 코드 생성에 대한 자세한 내용은 클라이언트 코드 생성 항목을 참조하십시오. 코드 생성을 사용자 지정하는 방법에 대한 자세한 내용은 생성된 코드 사용자 지정 항목을 참조하십시오.
Silverlight 클라이언트에 쿼리 결과 표시
-
MainPage.xaml을 엽니다.
-
왼쪽의 도구 상자에서 XAML 뷰의 Grid 요소 안으로 DataGrid 컨트롤을 끌어 옵니다.
도구 상자에서 DataGrid 컨트롤을 끌어 오면 네임스페이스
using System.Windows.Controls문이 MainPage.xaml.cs 파일에 추가되고 System.Windows.Controls.Data 및 System.Windows.Controls.Data.Input 어셈블리에 대한 참조가 클라이언트 프로젝트에 자동으로 추가됩니다.
주의: 도구 상자에서 끌어 오지 않고 DataGrid를 추가하는 경우 코드 숨김 파일에서 수동으로 using 문을 추가하고 어셈블리에 대한 참조를 클라이언트 프로젝트에 추가해야 합니다. -
다음 XAML과 같이
AutoGeneratedColums값을 True로 변경하고DataGrid요소의 이름을SovereignGrid로 지정한 다음Height및Width를 조정합니다.<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> -
MainPage.xaml.cs 파일을 엽니다.
-
using RIAServicesPocoExample.Web;문 및using System.ServiceModel.DomainServices.Client;문에using(C#) 또는Imports(Visual Basic)를 추가합니다.RIAServicesPocoExample.Web 네임스페이스는 RIAServicesPocoExample.Web.g.cs(또는 RIAServicesPocoExample.Web.g.vb)에서 클라이언트 프로젝트에 대해 생성된 코드를 포함하는 네임스페이스입니다.
-
SovereignDomainContext를 인스턴스화하려면MainPage클래스에서private SovereignDomainContext _sovereignContext = new SovereignDomainContext();코드 줄을 추가합니다. -
LoadOperation을 사용하여
GetSovereignsQuery메서드를 호출하는 방법으로 고객 엔터티를 검색합니다(LoadOperation<Sovereign> loadOp = this._sovereignContext.Load(this._sovereignContext.GetSovereignsByReignEndQuery(1500));). -
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; } } } -
F5 키를 눌러 응용 프로그램을 실행합니다.
중세 시대(통치 기간이 1500년대 이전에 끝나는) 통치자(알파벳 순서)의 속성만 표시된 테이블이 브라우저에 표시됩니다.
보안