希望我在这里很清楚。我有一个名为A
. 我有一个名为M
. 我有一个模型存储库M
和它映射到的数据库内容RM
。
我的 ViewModel,A
是否有我的 Model 的属性和M
我的 Repository的属性RM
。
然后,我将通过调用各种方法来使用它RM
并绑定到M
它们,我将传递给RM
like中的某些方法Save()
。
说得通?那是“正常”还是接近?
希望我在这里很清楚。我有一个名为A
. 我有一个名为M
. 我有一个模型存储库M
和它映射到的数据库内容RM
。
我的 ViewModel,A
是否有我的 Model 的属性和M
我的 Repository的属性RM
。
然后,我将通过调用各种方法来使用它RM
并绑定到M
它们,我将传递给RM
like中的某些方法Save()
。
说得通?那是“正常”还是接近?
根据您的喜好,您可以描述一种典型的情况。如果您的视图模型希望使用实体,那么它可以通过存储库来实现,您可以使用构造函数注入作为依赖项注入该存储库,并且您的视图模型可以针对抽象而不是存储库的特定实现工作。
如果您希望在构建后稍后访问存储库,那么您可以将存储库分配给私有字段或属性。
就您的模型而言,您可以拥有一个将其公开给视图的属性,这样您就不需要在视图模型上复制模型的属性。但是,这取决于您是否对直接访问模型的视图感到满意,这可能违反了 LoD(德米特法则),以免违反 DRY(不要重复自己)原则。
一种方法是从视图模型中公开 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.
}
这允许您在保存之前和之后执行其他操作,您可以使用其他属性来决定是否保存以及保存什么,以及您的视图模型“保存”的方式仍然是视图模型的一部分而不是存储库。
正如@devdigital 所提到的,我还建议为您的存储库考虑使用依赖注入。这意味着您不必在 Save 方法中创建存储库,而是使用传递给视图模型构造函数的存储库实例。