我的View Model是否有我的模型和我的Repository实例?

时间:2013-05-09 15:08:24

标签: c# .net mvvm repository-pattern

希望我在这里清楚。我有一个名为A的ViewModel。我有一个名为M的模型。我有一个模型M的存储库以及它映射到名为RM的数据库内容。

我的ViewModel A是否具有我的模型M的属性和我的存储库RM的属性。

然后我会通过调用RM上的各种方法并绑定到M来使用它,我将传递给RM中的某些方法,例如Save()

有意义吗?那是“正常”还是甚至接近?

2 个答案:

答案 0 :(得分:1)

您可能会根据自己的偏好描述典型情况。如果您的视图模型希望与实体一起工作,那么它可以通过存储库执行此操作,您可以使用构造函数注入将其作为依赖项注入,并且您的视图模型可以针对抽象而不是存储库的特定实现。

如果您希望在构建后稍后访问存储库,则可以将存储库分配给私有字段或属性。

就模型而言,您可以拥有一个属性,将其公开给视图,这样您就不需要在视图模型上复制模型的属性。但是,这取决于您是否对直接访问模型的视图感到满意,这可能违反了LoD(Demeter法则),以免违反DRY(不要重复自己)原则。

答案 1 :(得分:0)

一种方法是从视图模型中公开类型M的属性,就像您目前一样。然后,视图将绑定到此公开模型的属性。在您的视图模型上公开一个名为Save的方法,您的视图将在单击按钮时调用此方法(如果您使用WPF,则可以使用绑定)。然后,Save方法将创建存储库的实例,向其添加类型M的属性,然后保存存储库。

示例:

public class ViewModel
{
  public void Save()
  {
    // Create your repository
    // Add this.Model to the repository
    // Save the repository changes
  }
  public M Model { get; set; } // Bind your view to this.
}

这允许您在保存之前和之后执行其他操作,您可以使用其他属性来决定是否以及保存的内容,以及视图模型“保存”如何仍然是视图模型的一部分而不是存储库。< / p>

我还建议使用@devdigital提到的依赖注入为您的存储库。这意味着您不必在Save方法中创建存储库,而是使用传递给视图模型构造函数的存储库实例。

相关问题