[英]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>();
在這種模式的幫助下,您可以執行其他一些令人敬畏的事情:
MockApiRepository
來返回示例數據,而不用進行API調用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.