【问题标题】:prism mvvm server and client with same modelprism mvvm 服务器和客户端具有相同的模型
【发布时间】:2017-08-30 13:59:20
【问题描述】:

我的服务器正在使用一个包含所有模型类的程序集 (model.dll)。 我想使用 MVVM 在我的 UWP-Client-App 中使用这些类。

在 MVVM 中,我所有的模型类都必须继承 BindableBase(Prism)。 有没有办法在我的客户端中使用相同的模型类,还是我必须再次为客户端创建它们?

我能看到的唯一方法是所有模型类都继承 BindableBase 但我在服务器上我不需要这种依赖...

【问题讨论】:

  • 您需要BindableBase 还是INotifyPropertyChanged?要求模型(甚至视图模型)从 BindableBase 派生听起来很奇怪,而实现 INotifyPropertyChanged 的模型非常好

标签: c# mvvm uwp prism


【解决方案1】:

由于您想在服务器和客户端上使用这些类,我想您正在考虑将它们放入 PCL(可移植类库)中,因此您只需为每个模型维护 1 个文件。这意味着您想要在客户端上的所有代码也将在服务器上可用。

Prism 的BindableBase 只不过是INotifyPropertyChanged 的辅助实现。因此,您可以使用BindableBase 或自己实现INotifyPropertyChanged。无论哪种方式,您的后端都会有一些“前端”代码。

请注意,为了能够使用BindableBase,您没有自动属性,而是有属性设置器来触发INotifyPropertyChanged(当您自己实现接口时也是如此)。

private string _name;
public string Name
{
    get { return _name; }
    set { SetProperty(ref _name, value); }
}

我通常做的是为我的模型创建一个 PCL,添加Prism.Core NuGet 包(它本身就是一个 PCL)并使用我的服务器上的“前端”代码。如果您想知道 Prism.Core 中的代码是什么,那就是Source/Prism folder 下的所有内容。不需要在服务器端引入 Prism.Windows。


你有什么选择?

  • 将所有模型写入两次,一次为服务器使用自动属性,一次为客户端使用 BindableBase/INotifyPropertyChanged。在您的模型不一致之前,我给它不到一周的时间。 Tou 反驳说,您可以进行代码(重新)生成以生成双方之一。
  • 将Fody 用于INotifyPropertyChanged 而不是Prism 的BindableBase,您可以继续使用Prism 的其余部分。但在我看来,这有同样的问题,将Fody的属性带到服务器上。
  • 使用链接的项目文件在服务器和客户端之间共享模型,因此文件仍然只存在一次。使每个类都成为局部类,在客户端中放置第二个局部类并将 Fody 的属性放在该定义上。对我来说似乎很麻烦。

结论:无论您使用的是 Prism 还是 Fody,都要学会忍受对服务器端的小依赖,这会带来单一模型的巨大优势。

【讨论】:

  • 谢谢巴特。这就是我想阅读的内容:) 我的模型类是 .NET Standard 1.4(UWP 仅支持此版本)。使用 PCL 优于 .NET Standard 有什么优势吗?我认为 .NET Standard 是共享库的“新”方式。
  • .NET Standard 是前进的方向,但是在我们迁移之前,我们正在等待大多数项目的 v 2.0(主要是因为涵盖的 API)。如果 1.4 为您带来了足够的覆盖范围,那么没有什么能阻止您使用 .NET Standard。
猜你喜欢
  • 2012-04-06
  • 2018-11-20
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多