我的代码背后是否应该直接调用我的视图模型或我的服务?

时间:2013-03-12 17:55:51

标签: c# windows-phone-7 mvvm

我正在尝试将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);
            });

        }

2 个答案:

答案 0 :(得分:0)

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

要直接回答您的问题,您的View(代码隐藏)应该将视图模型中的UI元素单击到方法(命令绑定或其他机制)的事实传递。

然后,你Veiw Model决定接下来该做什么。它可能决定是时候导航到特定的网页,此时它会通知视图移动到所请求的页面。

ViewModel和View通信的精确方法与您正在使用的框架有很大关系,如果您是“ViewModel First”或“View First”有点人。

答案 1 :(得分:0)

为了简单起见...... View Models是您的应用程序的业务逻辑和大脑。 View应该只处理数据显示。我认为认证是“大脑”的一部分,并把它放在你的视图模型的某个地方。您甚至可能会更复杂(取决于您的应用程序的需要)并将身份验证Login方法放在视图模型的基类中。这样,如果需要,可以通过任何页面访问登录呼叫。

将代码紧紧地放在你的代码背后,将代码与你的视图紧密结合在一起 - 使其不能重复使用。如果你想要最好的建筑,我会避免这种情况。可以将代码放在视图后面的代码中。

我强烈不同意MVVM存在的评论,以避免代码落后。我使用的经验法则是:View的代码隐藏的目的是否仅支持视图/显示功能? (也许你需要编码来动画一些东西或改变一个数据模板 - 从而改变它的显示)。逻辑背后的代码应该是特定的显示。因此,根据此规则,登录不是特定于显示的,不应该是方法背后的代码..

我的2美分