티스토리 뷰

반응형

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

서비스 프로젝트에서 사용한 테이블 클래스 명은 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();
    }
}

 

 

 

 

 

반응형
댓글