【问题标题】:Where should I place authentication-logic in my MVVM mobile application?我应该将身份验证逻辑放在我的 MVVM 移动应用程序中的什么位置?
【发布时间】:2015-02-14 02:32:50
【问题描述】:

所以我目前正在使用 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 通信的包装方法,以及诸如持久化/获取身份验证请求中使用的用户凭据之类的内容?

想法?

【问题讨论】:

    标签: mvvm xamarin xamarin.forms


    【解决方案1】:

    绝对是选项 A。始终让您的虚拟机通过命令/方法与您的服务/存储库对话。实际上,您应该将 AuthenticationService 注入到您的 ViewModel 中,但那是另一个主题。

    【讨论】:

    • 这就是我最终要做的。我在“根”创建了我所有服务的新实例,并从那里将它们注入到需要它们的地方。我也最终选择了选项 A。所以我想结果还不错:)
    【解决方案2】:

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

    首先,让 View 直接与非纯 UI 相关的任何内容对话,这违反了 MVVM。没有应用逻辑,没有后端调用,nada。

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

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 2015-10-19
      相关资源
      最近更新 更多