블로그 이미지
* Microsoft MVP - Windows Development 2014 ~ 2019 5ring * LINE : kaki104 * facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/ kaki104

카테고리

List All (551)
Xamarin Forms (4)
Bot Framework (19)
Azure (9)
Windows 10 (35)
Facebook News & Tips (158)
Windows App(Universa.. (83)
Windows 8&8.1 (113)
Windows Phone 8 (42)
Silverlight (37)
HTML5 & MVC4 (16)
WPF (1)
Portable Class Library (2)
Uncategorised Tips a.. (3)
Kinect for Windows (2)
ETC (12)
kaki104 Scrap (4)
App News (11)
Total522,039
Today48
Yesterday101

애제를 이용해서 테스트를 진행하는데, 또 다른 문제가 발생했다.

서비스 프로젝트에서 사용한 테이블 클래스 명은 TodoItem

클라이언트 프로젝트에서 사용한 모델 클래스 명은 TodoItemM

이렇게 이름이 다른 경우 아래 셈플 코드대로 작업이 불가능하다.

 

 

 

todoTable = App.MobileService.GetTable<TodoItemM>();
TodoItemMs = await todoTable.ToCollectionAsync();

 

 

그래서 찾아본 것이 string으로 가지고 오는 방법인데..이 경우에는 사용 방법이 복잡해 질 것 같다.

 

 

var table = App.MobileService.GetTable("TodoItem");
var result = await table.ReadAsync("");

 

 

우훔..그래서 다시 구글링을 해서 아래 내용을 찾아냈다.

 

http://stackoverflow.com/questions/17280228/azure-mobile-json-net-map-class-to-table-with-different-name

 

클래스 이름 위에 아래와 같은 attribute를 추가하면 클래스가 사용하는 테이블 이름을 변경할 수 있다고 한다.

[DataTable("TodoItem")]

public class TodoItemM : BindableBase

{...}

 

여기서 간단히 끝났으면 참 좋은데, 난 여기서 한가지 더 고민이 있었다.

DataTable은 Microsoft.WindowsAzure.MobileServices에 속한 attribute이다. 그런데, 내가 만들고 있는 프로젝트는 기본적으로 모든 모델을 PCL에 넣어 놓고 있는데, PCL에는 Azure Mobile Service용 Nuget package를 추가할 수 없다는 것이다.

 

처음에는 partial 클래스로 만들어서 사용해 볼려고 했지만, 실패했다. 그래서, Wrap클래스를 만들어서 사용하기로 했다.

 

최종 결과는 아래와 같다.

 

 

1. PCL project Model

 

namespace CrossPlatform.Universal.PCL.Models
{
    public class TodoItemM : BindableBase
    {
        private string _text;
        private bool _complete;
        public string Id { get; set; }

        [JsonProperty(PropertyName = "text")]
        public string Text
        {
            get { return _text; }
            set { SetProperty(ref _text, value); }
        }

        [JsonProperty(PropertyName = "complete")]
        public bool Complete
        {
            get { return _complete; }
            set { SetProperty(ref _complete, value); }
        }
    }
}

 

 

2. Universal shared project Model

 

namespace OneSearch.Universal.Models
{
    [DataTable("TodoItem")]
    public partial class TodoItemMWrap : TodoItemM
    {
    }
}

 

 

3. Universal shared project ViewModel

 

private IMobileServiceTable<TodoItemMWrap> _todoTable = App.MobileService.GetTable<TodoItemMWrap>();

 

private MobileServiceCollection<TodoItemMWrap, TodoItemMWrap> _todoItemMs;

public MobileServiceCollection<TodoItemMWrap, TodoItemMWrap> TodoItemMs
{
    get { return _todoItemMs; }
    set { this.RaiseAndSetIfChanged(ref _todoItemMs, value); }
}

 

 

private async void RefreshTodoItems()
{
    MobileServiceInvalidOperationException exception = null;
    try
    {
        TodoItemMs = await _todoTable.ToCollectionAsync();
    }
    catch (MobileServiceInvalidOperationException e)
    {
        exception = e;
    }

    if (exception != null)
    {
        await new MessageDialog(exception.Message, "Error loading items").ShowAsync();
    }
}

 

 

 

 

 

Posted by MVP kaki104

티스토리 툴바