방법: Windows Phone의 OData 서비스 사용

2012-02-09

이 항목에서는 Windows Phone 용 OData 클라이언트 라이브러리를 사용하여 Windows Phone 응용프로그램에서 OData(Open Data Protocol) 피드를 사용하는 방법에 대해 설명합니다.

Windows Phone 용 OData 클라이언트 라이브러리는 OData를 지원하는 데이터 서비스에 대한 HTTP 요청을 생성하고 응답 피드의 항목을 클라이언트의 개체로 변환합니다. 이 클라이언트를 사용하여 Listbox 또는 Textbox와 같은 Windows Phone 컨트롤을 OData 데이터 피드가 포함된 DataServiceCollection<(Of <(<'T>)>)> 클래스 인스턴스에 바인딩할 수 있습니다. 이 클래스는 컨트롤에서 발생시킨 이벤트를 처리하여 DataServiceContext 클래스가 컨트롤의 데이터에 대한 변경 사항과 동기화되도록 유지합니다. Windows Phone 응용프로그램에서 OData 프로토콜을 사용하는 방법에 대한 자세한 내용은 Windows Phone의 OData(Open Data Protocol) 클라이언트를 참조하십시오.

쿼리가 DataServiceCollection<(Of <(<'T>)>)> 클래스에 포함될 데이터 개체를 결정합니다. 이 쿼리는 LINQ(Language Integrated Query) 또는 URI(Uniform Resource Identifier)를 지원하는 DataServiceQuery<(Of <(<'TElement>)>)>로 지정됩니다. 그런 다음 DataServiceCollection<(Of <(<'T>)>)> 클래스의 LoadAsync(IQueryable<(Of <<'(T>)>>)) 메서드에 매개 변수로 지정됩니다. 이 메서드를 실행하면 컬렉션의 데이터 개체로 구체화되는 OData 피드가 반환됩니다. 이 컬렉션이 컨트롤의 바인딩 소스인 경우 컨트롤을 통해 컬렉션의 데이터가 표시됩니다. URI를 사용하여 OData 서비스를 쿼리하는 방법에 대한 자세한 내용은 OData 웹 사이트의 OData: URI Conventions 페이지를 참조하십시오.

이 항목의 절차는 다음 작업을 수행하는 방법을 보여 줍니다.

  1. 새로운 Windows Phone 응용프로그램을 만듭니다.

  2. 프로젝트에 데이터 서비스 참조를 추가합니다.

  3. OData 서비스를 쿼리하고 결과를 응용프로그램의 컨트롤에 바인딩합니다.

참고참고:

이 예제에서는 DataServiceCollection<(Of <(<'T>)>)> 바인딩 컬렉션을 사용하여 Windows Phone 응용프로그램의 단일 페이지에 바인딩하는 기본 데이터 바인딩을 보여 줍니다. 실행하는 동안 발생할 수 있는 상태 변경 시 이 응용프로그램에서 응용프로그램 데이터를 유지하고 복원하는 방법에 대한 자세한 내용은 방법: Windows Phone의 OData 클라이언트 상태 지속를 참조하십시오. MVVM(Model-View–ViewModel) 디자인 패턴을 사용하고 실행 중 상태를 유지하는 다중 페이지 Windows Phone 응용프로그램의 예는 연습: Windows Phone의 OData(MVVM 포함) 사용을 참조하십시오.

이 예에서는 OData 웹 사이트에 게시된 Northwind 샘플 데이터 서비스를 사용합니다. 이 샘플 데이터 서비스는 읽기 전용이므로 변경 사항을 저장하려고 하면 오류가 반환됩니다.

Windows Phone 응용프로그램을 만들려면

  1. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 버튼으로 클릭하고 추가를 가리킨 다음 새 프로젝트를 선택합니다.

  2. 새 프로젝트 추가 대화 상자의 설치된 템플릿 창에서 Windows Phone용 Silverlight를 선택한 다음 Windows Phone 응용프로그램 템플릿을 선택합니다. 프로젝트 이름을 ODataNorthwindPhone으로 지정합니다.

  3. 새 Windows Phone 응용프로그램 대화 상자의 대상 Windows Phone 버전 드롭다운 상자에서 Windows Phone 7.1을 선택합니다.

  4. 확인을 클릭합니다. Silverlight용 응용프로그램이 생성됩니다.

프로젝트에 데이터 서비스 참조를 추가하려면

  1. ODataNorthwindPhone 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 서비스 참조 추가를 클릭합니다.

    서비스 참조 추가 대화 상자가 나타납니다.

  2. 주소 텍스트 상자에 다음 URI 값을 입력하고 이동을 클릭합니다.

    http://services.odata.org/Northwind/Northwind.svc/
    

    읽기 전용의 공용 Northwind 샘플 데이터 서비스에서 메타데이터 문서가 다운로드됩니다.

  3. 네임스페이스 텍스트 상자에 Northwind를 입력한 다음 확인을 클릭합니다.

    그러면 데이터 서비스 리소스에 액세스하고 상호 작용하는 데 사용되는 데이터 클래스가 포함된 새 코드 파일이 프로젝트에 개체로 추가됩니다. 데이터 클래스는 ODataNorthwindPhone.Northwind 네임스페이스에 생성됩니다. System.Data.Services.Client.dll 어셈블리에 대한 참조도 추가됩니다.

Windows Phone 응용프로그램 사용자 인터페이스를 정의하려면

  1. 프로젝트에서 MainPage.xaml 파일을 두 번 클릭합니다.

    Windows Phone 응용프로그램의 사용자 인터페이스인 MainPage 클래스의 XAML 태그가 열립니다.

  2. 고객 정보를 표시하는 기본 페이지의 사용자 인터페이스를 정의하는 다음 태그로 기존 XAML 태그를 바꿉니다.

    <phone:PhoneApplicationPage
        x:Class="ODataNorthwindPhone.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:my="clr-namespace:ODataNorthwindPhone.Northwind"
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 
        d:DataContext="{d:DesignInstance Type=my:Customer, CreateList=True}"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
        shell:SystemTray.IsVisible="True" Loaded="MainPage_Loaded">
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
                <TextBlock x:Name="ApplicationTitle" Text="Northwind Sales" 
                           Style="{StaticResource PhoneTextNormalStyle}"/>
                <TextBlock x:Name="PageTitle" Text="Customers" Margin="9,-7,0,0" 
                           Style="{StaticResource PhoneTextTitle1Style}"/>
            </StackPanel>
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <ListBox x:Name="MainListBox" Margin="0,0,-12,0" ItemsSource="{Binding}">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Margin="0,0,0,17" Width="432">
                                <TextBlock Text="{Binding Path=CompanyName}" TextWrapping="NoWrap" 
                                           Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                                <TextBlock Text="{Binding Path=ContactName}" TextWrapping="NoWrap" 
                                           Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
                                <TextBlock Text="{Binding Path=Phone}" TextWrapping="NoWrap" Margin="12,-6,12,0" 
                                           Style="{StaticResource PhoneTextSubtleStyle}"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Grid>
        </Grid>
    </phone:PhoneApplicationPage>
    

데이터 서비스 데이터를 Windows Phone 응용프로그램의 컨트롤에 바인딩하는 코드를 추가하려면

  1. 프로젝트에서 MainPage.xaml 파일의 코드 페이지를 열고 다음 using 문을 추가합니다.

    using System.Data.Services.Client;
    using ODataNorthwindPhone.Northwind;
    
    
  2. MainPage 클래스에 다음 선언을 추가합니다.

    // Declare the data service objects and URIs.
    private NorthwindEntities context;
    private readonly Uri northwindUri =
        new Uri("http://services.odata.org/Northwind/Northwind.svc/");
    private DataServiceCollection<Customer> customers;
    
  3. MainPage 클래스에 다음 MainPage_Loaded 메서드를 추가합니다.

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        // Initialize the context and the binding collection 
        context = new NorthwindEntities(northwindUri);
        customers = new DataServiceCollection<Customer>(context);
    
        // Define a LINQ query that returns all customers.
        var query = from cust in context.Customers
                    select cust;
    
        // Register for the LoadCompleted event.
        customers.LoadCompleted
            += new EventHandler<LoadCompletedEventArgs>(customers_LoadCompleted);
    
        // Load the customers feed by executing the LINQ query.
        customers.LoadAsync(query);
    
    }
    
    

    페이지가 로드될 때 이 코드는 바인딩 컬렉션과 콘텐츠를 초기화하고 바인딩 컬렉션에서 발생시킨 DataServiceCollection<(Of <(<'T>)>)> 개체의 LoadCompleted 이벤트를 처리할 메서드를 등록합니다.

  4. MainPage 클래스에 다음 customers_LoadCompleted 메서드를 추가합니다.

    void customers_LoadCompleted(object sender, LoadCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            // Handling for a paged data feed.
            if (customers.Continuation != null)
            {
                // Automatically load the next page.
                customers.LoadNextPartialSetAsync();
            }
            else
            {
                // Set the data context of the list box control to the sample data.
                this.LayoutRoot.DataContext = customers;
            }
        }
        else
        {
            MessageBox.Show(string.Format("An error has occurred: {0}", e.Error.Message));
        }
    }
    

    LoadCompleted 이벤트를 처리할 때 요청이 성공적으로 반환되면 다음 작업이 수행됩니다.

실행하는 동안 발생할 수 있는 상태 변경 시 응용프로그램 데이터를 유지하고 복원하는 방법에 대한 자세한 내용은 방법: Windows Phone의 OData 클라이언트 상태 지속를 참조하십시오.

표시: