C# MVC、MVP、MVVM等用户界面设计模式中的模型是什么?

C# MVC、MVP、MVVM等用户界面设计模式中的模型是什么?,c#,.net,design-patterns,user-interface,C#,.net,Design Patterns,User Interface,我看过很多使用模型视图UI设计模式的教程和示例,它们的实现方式都非常不同,尤其是模型部分。在一些示例中,模型是一些it的数据访问层(如存储库模式)中的数据(某些DB的实际对象表示形式)和一些it的服务层中的数据… 如果有人告诉你他正在他的应用程序中使用MV*模式,它会告诉你关于应用程序设计的什么?它是否在对象图中维护数据库的内存表示,并将其用作数据源或某个数据访问层来查询数据库 您将选择什么作为面向数据的智能客户端应用程序的模型,该应用程序主要包含带表格的选项卡页面?如果有人说,他使用的是MV*

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


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

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

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


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

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


下面是我对一个类似问题得到的一些非常有用的反馈

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

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


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

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

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


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

是的,基本相同,但我使用Nhibernate作为持久化器,使用DTO实体EntityUI继承,而不是带有自动映射器的DTO实体,那么,您的模型是什么?它的内存对象图是以备份EF作为持久器的,还是EF数据访问巢穴?可能是后者,我只在需要时从数据库中获取数据,而且我使用延迟加载,因此每次访问都会推迟到实际使用为止。@tvanfosson:但我应该选择查询什么?直接数据库还是内存对象图?大多数情况下,我的应用程序都会在内存对象图中加载几乎整个DB,查询它是有意义的,因为它速度更快,但我也有包含复杂和重聚合的视图,直接查询DB更容易、更快,从对象图中持续维护这些视图状态太难了,从db中按需刷新它们更容易…@Breaked Pipe-您可能需要考虑一个维护对象图的自定义存储库(或缓存),但将一些查询直接引用到db。这将使你的应用程序的其余部分不知道查询是如何完成的。@tvanfosson:是的,这就是我在想的,你认为我可以使用Nhibernate二级缓存来实现这些目的,还是应该实现我自己的自定义系统?如果是的话,System.Runtime.Caching能帮我解决这些问题吗?@Breaked Pipe——不是nHibernate用户,所以我不能帮你。我猜想,如果您这样做的话,您可能需要一个定制的缓存,可能是围绕应用程序缓存的。这真的取决于你的应用程序和数据结构——我在不同的情况下都做过。谢谢你的回答,他们让我对如何实现我的应用程序体系结构了如指掌。