【问题标题】:What is Model in user interface design patterns like MVC, MVP, MVVM?什么是用户界面设计模式(如 MVC、MVP、MVVM)中的模型?
【发布时间】:2011-06-02 12:25:02
【问题描述】:

我看过很多使用模型-视图 UI 设计模式的教程和示例,它们都以非常不同的方式实现它们,尤其是模型部分。在某些示例中,模型在某些示例中是数据(某些 DB 的实际对象表示),在某些示例中是数据访问层(如存储库模式)在某些示例中是服务层...
如果有人告诉你他在他的应用程序中使用了 MV* 模式,那么它会告诉你关于应用程序设计的什么信息?它是否在对象图中维护数据库在内存中的表示,并将其用作数据源或某些数据访问层来查询数据库...

您将选择什么作为面向数据的智能客户端应用程序的模型,该应用程序主要包含带有表格的标签页?

【问题讨论】:

    标签: c# .net design-patterns user-interface


    【解决方案1】:

    模型一词至少有两种含义。有你的域模型。这里的意义是你如何表示你的数据。有很多方法可以构建数据,也有很多方法可以访问它。当我们从这个意义上谈论模型时,我们并不特别关心您如何访问构成它的结构,即数据访问或持久层,尽管您可能还会听到人们谈论持久性模型。这里,人们指的是持久性实现使用的特定哲学,例如 ActiveRecord 或 Repository。您可能还会听到这些被称为模式。

    最后,模型一词在视图上下文中的 MVC、MVP 和 MVVM 中具有非常特定的含义。在这种情况下,它意味着与视图关联的特定数据对象,即视图模型。这可能是您的域对象之一,但更典型的是,它是一个特定于视图的对象,它封装来自一个或多个域对象的数据以及辅助数据,例如特定视图使用的用户数据。

    对于您的应用程序,选择最适合您的开发环境和语言的持久性模型——MS 世界中的 LINQ to SQL、LINQ to Entities、nHibernate、Castle ActiveRecord 等为每个应用程序创建特定于视图的模型(类)包含该视图所需数据的视图。使用您的控制器查询您的域模型以提取视图所需的信息并将其映射到视图模型。

    【讨论】:

    • @tvanfosson:但我应该选择查询什么? DB直接还是内存对象图?大多数时候,我的应用程序将几乎整个数据库加载到内存对象图中,查询它是有意义的,因为它更快,但我也有包含复杂和繁重聚合的视图,并且直接查询这些数据库更容易和更快,从对象图中持续维护这些视图状态太难了,从数据库按需刷新它们更容易......
    • @Broken Pipe - 您可能想考虑一个自定义存储库(或缓存)来维护您的对象图,但将一些查询直接引用到数据库。这将使您的应用程序的其余部分不知道查询是如何完成的。
    • @tvanfosson:是的,我就是这么想的,你认为我可以使用 Nhibernate 二级缓存来实现这些目的,还是应该实现自己的自定义系统?如果是这样,System.Runtime.Caching 对这些有用吗?
    • @Broken Pipe -- 不是 nHibernate 用户,所以我无法帮助你。我怀疑如果你走那条路,你可能想要一个自定义缓存,也许包裹在应用程序缓存周围。这实际上取决于您的应用程序和数据结构——我在不同的情况下都做过。
    • 感谢您的回答,他们让我对如何实现我的应用架构有了一些清晰的认识。
    【解决方案2】:

    如果有人说,他正在使用 MV* 模式,这意味着应用程序被分成几个部分,没有直接引用特定类型的行为,它没有说明实际的实现。 MVVM 意味着,你有一个模型、一个视图模型和视图部分,仅此而已。

    模型是您的数据存储。这并没有说明它的实现,它可以是任何东西,具体取决于手头的任务。但是,应该使用接口访问它,以便您可以快速交换实现。从某种意义上说,这就是 MVVM 模式的重点——通过接口解耦三层。

    您的描述听起来很像我目前的项目 - 我使用 sqlite 作为支持存储,使用实体框架作为 ORM。但是,我也使用 T4 生成 Dto 对象,然后通过 ViewModel 中的 automapper 进行映射,因为这些对象只需要数据,而不需要持久性。

    【讨论】:

    • 是的,几乎相同,但我使用 Nhibernate 作为持久化器,并使用 DTO-Entity-EntityUI 继承而不是带有自动映射器的 DTO-Entity,那么你的模型是什么,它是带有支持 EF 的内存对象图持久化器,还是 EF 数据访问巢穴?
    • 可能是后者,我只在需要时从数据库中获取数据,而且我使用延迟加载,因此每次访问都会延迟到实际使用为止。
    【解决方案3】:

    模型通常指的是数据层,但正如我发现的那样,在 MVC 中,当实现 ntier 方法时,这可能有点误导。原因是模型不包含在它自己的程序集中。

    这是我对类似问题Confussion over MVC and entity model得到的一些非常有用的反馈

    【讨论】:

      【解决方案4】:

      模型可以被视为数据容器,有助于呈现表示组件和/或将数据持久化到/从数据源(即数据库等)。除了数据容器元素之外,模型可能包含也可能不包含行为,具体取决于相应架构的设计上下文。

      虽然“模型”一词在模型-视图-控制器模式上下文中经常被讨论和使用,但它是当前软件架构世界中最重要的考虑因素之一

      您可能希望查看以下article,其中描述了与表示组件和模型相关的一些流行和新设计模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 2010-11-20
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        相关资源
        最近更新 更多