[英]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.