【问题标题】:Architecture of a Xamarin app, communicating with a web serverXamarin 应用程序的体系结构,与 Web 服务器通信
【发布时间】:2015-05-23 04:37:21
【问题描述】:

如标题中所述,我想构建一个与 Web 服务器通信的 Xamarin Forms 应用程序。在客户端,我当然使用MMVM 模式。

我的问题是:与服务器的通信如何?在我看来,服务器应该对具体的客户端技术一无所知(例如INotifyPropertyChanged),所以在这一层我仍然必须应用MVC 模式进行通信,对吧?

这种方法让我睡不着觉的是,我需要在每个方向上转换对象 2 次: Entity <--> MVC-Model (Dto) <--> MVVM-ViewModel

我的假设是对的还是完全偏离了轨道?

【问题讨论】:

  • 是的。我认为您会希望 DTO 对象在系统之间进行通信并转换为它们自己的框架特定层。
  • DTO 是 MVVM 和 MVC 模式中 M(odel) 的一部分。 INotifyPropertyChanged 是 MVVM 中 ViewModel 的一部分。即使您需要编写代码来将 DTO 包装在 VM 中,时间也(或多或少)节省在更少的控制器代码中。使用 Forms,您不需要控制器并且可以跳过 VM 并仅使用 View(XF View)作为 VM 替代品,但是您将无法在不支持 Forms 的平台上重用代码。如果您决定编写一个完整的 VM,那么很容易在其他地方重用(例如 WPF、Razor)。

标签: asp.net-mvc model-view-controller mvvm xamarin xamarin.forms


【解决方案1】:

实现此目的的一种方法是创建一个 WebAPI,然后您可以从共享 Xamarin Forms 项目中的视图模型调用该 WebAPI。

public class CommunicationService<T> where T : class
{
    public CommunicationService ()
    { 
    }

    public async Task<T> GetRequestAsync (string url)
    {
        var client = new System.Net.Http.HttpClient ();
        var response = await client.GetAsync (url);
        var responseResult = response.Content.ReadAsStringAsync ().Result;
        var result = JsonConvert.DeserializeObject<T> (responseResult); 
        return result; 
    }
}

然后我从我的视图模型中使用以下代码调用我的函数:

var communicationService = new CommunicationService<List<MyDtoModel>> ();    
var items = await communicationService.GetRequestAsync (@"http://myurl.com/api/controller/action");

然后您可以使用 AutoMapper 将结果映射到您的视图模型,或者当然,直接使用 DTO,即使这不是 MVVM 模式的最佳实践。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2011-04-07
    • 2011-09-19
    相关资源
    最近更新 更多