如何在viewModel依赖于多个模型时访问数据

时间:2018-05-20 16:26:46

标签: c# mvvm repository-pattern

我是一个试图绕过MVVM的新手。我正在尝试构建一些东西,并且没有找到如何处理这个问题的答案:

我有几个模型/实体,其中一些具有逻辑连接,我想知道何时/何时将它们完美地结合在一起。

假设我们有一个PersonModel:

public class PersonModel { 

public int Id {get;set;}
public string Name {get;set;}
...
}

还有一个ClubModel:

    public class ClubModel {

    public int Id {get;set;}
    public string Name {get;set;}
    ...}

我们有MembershipModel(一个人可以有几个俱乐部会员资格):

public class MembershipModel {

public int Id {get;set;}
public PersonId {get;set;}
public ClubId {get;set;}}

所有这些模型都存储在某个地方,并且模型在该数据存储中“保留”。

假设我们为每个提供标准CRUD操作的模型都有单独的存储库。

现在我想创建一个ViewModel来管理所有人,例如重命名,添加会员资格等 - > PersonMangementViewModel。

为了很好地将Person与其所有属性和成员资格绑定,我还将创建一个可以在PersonManagementViewModel中使用的PersonView(?)模型。它可以包含例如查看相关属性以及成员资格:

public class PersonViewModel : PersonModel {

public Color BkgnColor {get return SomeLogic();}
public IEnumberable<MembershipModel> {get;set;}
...
}

我的问题是,我如何巧妙地将会员信息转入PersionViewModel?我当然可以直接在PersionViewModel中创建一个MemberShipRepo实例,但这似乎不太好,特别是如果你有很多人。我还可以在PersonManagementViewModel中创建所有存储库,然后将引用传递给PersonViewModel。

或者更有意义的是创建另一个主要返回PersonViewModel的层(例如“服务”层),因此使用单个存储库并从PersonManagementViewModel调用(从而消除了它的负担并允许重复使用)其他地方的服务)?

很高兴指出了概念错误或进一步阅读。 感谢

1 个答案:

答案 0 :(得分:0)

我猜你正在为每个表创建单独的模型。没关系,但你的模型是碎片化的。您可以考虑使用Aggregate Root和Repository per Aggregate root而不是每个模型将相关数据放在一起。这个概念在DDD下讨论。但正如你所说,你是MVVM的新手,已经有很多东西需要学习。在这个阶段涉及DDD只会使事情变得复杂。

如果你决定把事情保持原样,我能猜到的最好和最快的事情就是你现在正在做的事情。从View Model中的数据存储(或任何位置)获取模型实例并以某种方式映射。像Automapper这样的工具很好,但它们并不适合每种情况。如果需要,请不要犹豫,手工绘制地图。您还可以使用混合方法(Automapper +手动映射)来简化操作。

关于服务层,当然......为什么不呢。完全取决于你。如果使用,该层通常包含您的业务逻辑,映射,数据格式,验证等。同样,每件事都取决于您。

我的建议:

  • 首先关注您的业务目标。
  • 设计模式很好,很有帮助。这些是许多特别有能力的开发人员的解压缩,以解决具体问题。使用它们。但是,不要不必要地坚持下去。阅读以上建议。简而言之,避免过度工程化。创建设计模式以解决特定问题。如果你没有这个问题,那就不要用不必要的模式弄乱你的代码。
  • 了解聚合根,DDD,存储库等。
  • 尽量避免使用Generic Repository。