我是一个试图绕过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调用(从而消除了它的负担并允许重复使用)其他地方的服务)?
很高兴指出了概念错误或进一步阅读。 感谢
答案 0 :(得分:0)
我猜你正在为每个表创建单独的模型。没关系,但你的模型是碎片化的。您可以考虑使用Aggregate Root和Repository per Aggregate root而不是每个模型将相关数据放在一起。这个概念在DDD下讨论。但正如你所说,你是MVVM的新手,已经有很多东西需要学习。在这个阶段涉及DDD只会使事情变得复杂。
如果你决定把事情保持原样,我能猜到的最好和最快的事情就是你现在正在做的事情。从View Model中的数据存储(或任何位置)获取模型实例并以某种方式映射。像Automapper这样的工具很好,但它们并不适合每种情况。如果需要,请不要犹豫,手工绘制地图。您还可以使用混合方法(Automapper +手动映射)来简化操作。
关于服务层,当然......为什么不呢。完全取决于你。如果使用,该层通常包含您的业务逻辑,映射,数据格式,验证等。同样,每件事都取决于您。
我的建议: