我的后台代码应该直接调用视图模型还是服务?

本文关键字:模型 视图 服务 调用 代码 后台 我的 | 更新日期: 2023-09-27 18:03:28

我试图使用MVVM与我的windows phone 7应用程序。我有点困惑,我应该如何做到这一点。

我有一个在web浏览器中导航的代码隐藏事件。现在,这个事件最终将调用一个方法,该方法将使用Google oAuth登录用户。

现在调用登录方法到Google的代码在我的服务层。我不确定我是否应该在我的VM中创建一个属性来调用我的服务层,或者我应该直接在我的代码隐藏页面中创建一个服务层对象并直接调用它。

最好的方法是什么?

编辑

我是这么做的

//

代码
   private void wbGoogle_Navigating(object sender, NavigatingEventArgs e)
        {
            var queryParmas = e.Uri.ParseQueryString();
            var code = queryParmas.ToList().Where(x => x.Key == "code").FirstOrDefault();
            if (!code.Equals(new KeyValuePair<string, string>()))
            {
                loginVm.AuthenticateUser(code.Value, TestCallBack);
            }
        }
 private void TestCallBack(Authorization a)
        {
            var d = a;
            // maybe assign "a" to some property back in the VM.
        }

//Vm

public void AuthenticateUser(string code, Action<GoogleContacts.Model.Authorization> CallbackOnSuccess)
    {
        loginService.SendCode(code, CallbackOnSuccess);
    }

//服务层

  public void SendCode(string code, Action<Authorization> CallbackOnSuccess)
        {
            var request = new RestRequest(TokenEndPoint, Method.POST);
            request.AddParameter("code", code);
            request.AddParameter("client_id", ClientId);
            request.AddParameter("client_secret", SecretKey);
            request.AddParameter("grant_type", GrantType);
            request.AddParameter("redirect_uri", RedirectUrl);
            client.ExecuteAsync<Authorization>(request, response =>
            {
                CallbackOnSuccess(response.Data);
            });
        }

我的后台代码应该直接调用视图模型还是服务?

视图模型是视图的模型-它是所有逻辑工作实际完成的地方。视图的职责是将信息呈现给UI并收集用户输入。视图执行的任何其他任务都开始与代码库紧密耦合,您最终将陷入维护噩梦。

为了直接回答你的问题,你的View (Code-Behind)应该将UI元素被点击的事实传递给View Model中的方法(命令绑定或其他机制)。

然后,您的视图模型决定下一步要做什么。它可能会决定是时候导航到一个特定的网页了,这时它会向视图发出信号,让它移动到所请求的页面。

ViewModel和View通信的精确方法与你使用的框架有很大关系,如果你是一个"ViewModel First"或"View First"的家伙。

为了保持简单…视图模型是你的业务逻辑和应用程序的大脑。视图应该只处理数据的显示。我认为身份验证是"大脑"的一部分,并将其放在视图模型的某个地方。您甚至可以更复杂一点(取决于应用程序的需要),并将身份验证Login方法放在视图模型的基类中。这样,如果需要的话,登录调用可以通过任何页面访问。

把它放在你的代码后面只会把代码和视图紧密地耦合在一起——使得它不能很好地重用。如果你想要最好的建筑,我会避免这种情况。将代码中的东西放在视图后面是可以的。

我强烈反对MVVM存在是为了避免代码滞后的评论。我使用的经验法则是:视图背后的代码存在的目的仅仅是为了支持视图/显示功能吗?(也许您需要编写代码来制作动画或更改数据模板—从而更改其显示)。逻辑后面的代码应该是特定于显示的。因此,根据此规则,Login不是特定于显示的,也不应该是代码隐藏方法。

My two cents