簡體   English   中英

MVVM-如何使用給定的REST-API dll

[英]MVVM - How to use a given REST-API dll

我開始使用mvvmlight在C#中學習MVVM。 從另一個項目中,我有一個給定的(但自制的)REST-API作為dll。 我正在此新項目中嘗試使用的dll。 它完全基於此API。 我不確定“模型”部分,也不想在編碼時重復自己。

問題是這樣的 :該應用程序具有多個“插件/部分”。 讓我們看一個類似於“組”部分的示例。 現在,API定義了具有所有屬性(例如“ groupname,Permissions,members”)的groups-Entity-Class。 然后,應用程序必須具有一個組模型,以及UI的groupsViewModel和GroupsView。 在這里,我還必須列出/顯示“組名,權限,成員”。

問題是:我是否必須從mvvm-model-class中的dll-entity-class重新聲明所有屬性? 還是使用Rest API的最佳方法是什么? 有沒有模式。 我了解了擴展對象模式。 但是我不知道。

提示:由於API是我自己編寫的(只有類,沒有mvvm或其他框架),因此我可以根據需要進行修改。

提前致謝!

看一下存儲庫模式: https : //msdn.microsoft.com/en-us/library/ff649690.aspx 基本上,您創建一個執行API調用的存儲庫,並將實體轉換為可在視圖中使用的格式。

如果API中的對象已經足夠,您可以簡單地返回它們,否則將它們在存儲庫中轉換為更有用的東西。

然后,在ViewModel中,您僅要求存儲庫返回模型,而無需關心它是如何以及以何種格式獲得的。

小例子:

interface IApiRepository
{
    Task<ObservableCollection<ApiModel>> GetApiModelsAsync();
}

class ApiRepository : IApiRepository
{
    private async Task<ObservableCollection> GetApiModelsAsync()
    {
        var myCollection = new ObservableCollection<ApiModel>();
        var result = await DoMyApiCall();
        foreach (result as item)
        {
            var newModel = new ApiModel();
            newModel.fillFromApi(item);
            myCollection.Add(newModel);
        }
        return myCollection;
    }   
}


class MyViewModel : ViewModelBase
{
    private readonly IApiRepository _apiRepository;

    public MyViewModel(IApiRepository apiRepository)
    {
        _apiRepository = apiRepository;
        InitializeViewModel();
    }

    private ObservableCollection<ApiModel> _apiModels;
    public ObservableCollection<ApiModel> ApiModels
    {
        get { return _apiModels; }
        set { Set(ref _apiModels, value); }
    }

    private async void InitializeViewModel()
    {
        //as soon as the repo is finished ApiModels will raise the RaisePropertyChanged event
        ApiModels = await _apiRepository.GetApiModelsAsync();
    }
}

//in you ViewModelLocator
SimpleIoC.Default.Register<IApiRepository, ApiRepository>();
SimpleIoC.Default.Register<MyViewModel>();

//construct your viewmodel (with the injected repository)
var vm = SimpleIoc.Default.GetInstance<MyViewModel>();

在這種模式的幫助下,您可以執行其他一些令人敬畏的事情:

  • 如果添加新的數據源,則只需更改存儲庫,而無需更改ViewModel。
  • 如果您想測試視圖(例如在設計模式下),則可以注入一個MockApiRepository來返回示例數據,而不用進行API調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM