繁体   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