gpt4 book ai didi

c# - 当一个 viewModel 依赖于多个模型时如何访问数据

转载 作者:太空宇宙 更新时间:2023-11-03 14:54:15 24 4
gpt4 key购买 nike

我是一名新手,正在努力了解 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(一个人可以有多个俱乐部成员(member)资格):

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

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

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

现在我想创建一个 View 模型来管理所有人员,例如重命名、添加成员资格等 -> PersonMangementViewModel

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

public class PersonViewModel : PersonModel 
{
public Color BkgnColor { get return SomeLogic(); }
public IEnumerable<MembershipModel> { get; set; }
...
}

我的问题是,我将如何巧妙地将成员资格信息放入 PersionViewModel?我当然可以直接在 PersionViewModel 中创建 MemberShipRepo 的实例,但这似乎不太好,尤其是当您有很多人时。我还可以在 PersonManagementViewModel 中创建所有存储库,然后将引用传递到 PersonViewModel。

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

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

最佳答案

我猜您正在为每个表创建单独的模型。没关系,但你的模型是零散的。您可以考虑使用每个聚合根而不是每个模型的聚合根和存储库将相关数据放在一起。这个概念在 DDD 下讨论。但是正如您所说,您是 MVVM 的新手,已经有很多东西要学了。在这个阶段涉及 DDD 只会使事情复杂化。

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

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

我的建议:

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

关于c# - 当一个 viewModel 依赖于多个模型时如何访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50436989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com