【问题标题】:Use Feature Folders with Prism将特征文件夹与 Prism 一起使用
【发布时间】:2019-08-12 11:23:02
【问题描述】:

我有一个使用 Prism 的 Xamarin.Forms 项目,并且视图和视图模型的数量越来越大。

在网络项目中,我通常使用功能文件夹,将相关代码组合在一起,例如:

  • 特点
    • 首页
      • Home.cshtml
      • Home.cs
      • Home.js
      • HomeController.cs
    • 小部件
      • List.cshtml
      • List.cs
      • List.js
      • Detail.cshtml
      • Detail.cs
      • Detail.js
      • WidgetsController.cs

我想在 Xamarin.Forms 项目中做同样的事情,但我不知道如何配置 Prism 以在这些位置而不是 ViewsViewModels 文件夹中查找视图和视图模型?

【问题讨论】:

    标签: mvvm xamarin.forms prism code-structure


    【解决方案1】:

    您可以手动为视图注册视图模型,也可以修改ViewModelLocator 用于查找视图的视图模型的约定。

    可以在here 找到一个示例,虽然这只是复制了原始约定,但它显示了从哪里开始修改:

    ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver( viewType => viewModelType );
    

    另外,this blog post 描述了如何更改约定以查找位于同一文件夹中视图之外的视图模型:

    ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>
    {
        var viewName = viewType.FullName;
        var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;
        var viewModelName = String.Format(CultureInfo.InvariantCulture, “{0}ViewModel, {1}”, viewName, viewAssemblyName);
        return Type.GetType(viewModelName);
    });
    

    【讨论】:

      【解决方案2】:

      虽然@Haukinger 在技术上是正确的,但您可以设置 ViewModelLocationProvider。我们建议您在注册时简单地指定 View 和 ViewModel。这要快得多,因为它避免了任何反射查找。

      containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>();
      

      【讨论】:

      • 对,这就是我所说的“您可以 [...] 为视图手动注册视图模型”的意思
      • 推荐手动注册 View 和 ViewModel 的原因是什么,而不是使用 SetDefaultViewTypeToViewModelTypeResolver? (我知道您的示例使用 DI,但也可以使用 ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver
      • 当依赖 ViewModelLocationProvider 根据约定自动解析 ViewModel 时,反射查找成本可能很高,尤其是在第 2-3 层设备上。通过在引导方法App.RegisterTypes 中显式映射关系,您为 Prism 提供了显式映射,允许它绕过任何反射成本。简而言之,它要快得多。
      猜你喜欢
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-15
      • 2013-04-03
      • 2018-07-08
      • 2017-06-08
      • 1970-01-01
      • 2017-04-14
      相关资源
      最近更新 更多