我应该在我的 MVVM 移动应用程序中的什么地方放置身份验证逻辑?

Where should I place authentication-logic in my MVVM mobile application?

所以我目前正在使用 Xamarin.Forms 开发应用程序。 Xamarin Forms 使用 MVVM 模式,我觉得使用这种模式有点舒服,但我确实有一些问题。为简单起见,我将使用一个单页应用程序示例。这是我到目前为止的结构:

MainView.xaml //View
MainView.xaml.cs //Code behind
MainViewModel.cs //ViewModel
DataAccessHelper //DAL layer helping me communicate with a REST-API & DB
Models
Other util classes

因此,对于诸如使用 REST-API 中的数据填充视图中使用的集合的逻辑放置在何处之类的东西;这很清楚。我为此使用 ViewModel,并且 ViewModel 与我的 DataAccessHelper 通信以执行操作。虽然 ViewModel 应该包含表示逻辑,但这样做是很自然的。但是,身份验证呢?这与屏幕上显示的数据没有任何关系。但显然,这是我可以执行任何其他请求之前必须完成的必要步骤。

所以这是我的问题:

视图是否应该直接与我的 DataAccessHelper 通信?比如说,在代码隐藏的构造函数中,我直接调用我的 DataAcess 帮助程序进行身份验证,然后如果一切顺利,我继续使用 ViewModel 的方法来获取数据并填充我的组件?或者我还应该在视图用于验证的 ViewModel 中放置一个方法吗?

即这个:

public partial class MainPage
{

    private MainPageViewModel ViewModel
    {
        get { return BindingContext as MainPageViewModel; }
    }

    public MainPage()
    {    
        ViewModel.Authenticate();
        ViewModel.LoadCountries();
        ViewModel.LoadCities();

        InitializeComponent();
    }
}

与此相比:

public partial class MainPage
{

    private MainPageViewModel ViewModel
    {
        get { return BindingContext as MainPageViewModel; }
    }

    public MainPage()
    {    
        var dataAccessHelper = new DataAcessHelper();
        dataAccessHelper.Authenticate();
        ViewModel.LoadCountries();
        ViewModel.LoadCities();

        InitializeComponent();
    }
}

或者两者都不是?这里的最佳做法是什么?甚至可以创建一个可以使用的身份验证对象。该对象将包含用于与 DAL 通信的包装器方法,以及诸如 persisting/getting 您在身份验证请求中使用的用户凭据之类的东西?

想法?

这不是一个事实性的答案,更多的是对使用 MVVM 的应用程序架构的看法,但这里是:

首先,让 View 直接与不纯粹 UI 相关的任何事物对话是违反 MVVM 的。没有应用程序逻辑,没有后端调用,nada。

相反,我会推荐健康剂量的关注点分离;有一个登录 View/ViewModel 来处理收集和验证凭据的过程,并且成功验证的结果将是导航到您尝试访问的视图。如果您需要向后端服务提供令牌或其他一些对象,请将其提供给 ViewModel 的构造函数(最好使用 IoC 容器和 ViewModelLocator),它会依次将其交给任何对象它为模型数据咨询的后端服务。

绝对是选项 A。始终让您的虚拟机通过 commands/methods 与您的 services/repositories 对话。实际上,您应该将 AuthenticationService 注入到您的 ViewModel 中,但那是另一个主题。