问题标签 [mvp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
user-interface - 什么是 MVP 和 MVC,有什么区别?
当超越RAD(拖放和配置)构建用户界面的方式时,许多工具鼓励您可能会遇到三种设计模式,称为Model-View-Controller、Model-View-Presenter和Model-View-ViewModel。我的问题分为三个部分:
- 这些模式解决了哪些问题?
- 它们有何相似之处?
- 它们有何不同?
c# - 您如何使用 MVP 将服务层消息/错误传达给更高层?
我目前正在从 UI 编写一个 ASP.Net 应用程序。我正在实现一个 MVP 架构,因为我厌倦了 Winforms,并且想要更好地分离关注点的东西。
因此,对于 MVP,Presenter 处理 View 引发的事件。这是我用来处理用户创建的一些代码:
我使用内置的 .Net 验证控件完成了主要表单验证,但现在我需要验证数据是否充分满足服务层的标准。
假设可以显示以下服务层消息:
- 电子邮件帐户已存在(失败)
- 输入的引用用户不存在(失败)
- 密码长度超过数据存储允许的长度(失败)
- 成员创建成功(成功)
我们还假设 UI 无法预期的服务层中将有更多规则。
目前,如果事情没有按计划进行,我会让服务层抛出异常。这是一个足够的策略吗?这段代码对你们来说有味道吗?如果我写了一个这样的服务层,你会不会因为必须编写以这种方式使用它的 Presenter 而感到恼火?返回代码似乎太老套了,布尔值不够丰富。
不由 OP 编辑:合并由 OP 作为答案发布的后续评论
Cheekysoft,我喜欢 ServiceLayerException 的概念。对于我没有预料到的异常,我已经有了一个全局异常模块。您是否觉得让所有这些自定义异常变得乏味?我在想捕获基本异常类有点臭,但不确定从那里进展如何。
tgmdbm,我喜欢那里巧妙地使用 lambda 表达式!
感谢 Cheekysoft 的跟进。因此,如果您不介意在未处理异常的情况下将用户显示为单独的页面(我主要是 Web 开发人员),那么我猜这将是策略。
但是,如果我想在用户提交导致错误的数据的同一视图中返回错误消息,那么我必须在 Presenter 中捕获异常?
以下是 Presenter 处理 ServiceLayerException 时 CreateUserView 的样子:
对于这种错误,最好将其报告给同一个视图。
无论如何,我认为我们现在超出了我原来的问题的范围。我会玩弄你发布的内容,如果我需要更多详细信息,我会发布一个新问题。
model-view-controller - 模型-视图-控制器有哪些替代方案?
在读大学和关注 SO 的发展过程中,我听说了很多关于 Model-View-Controller 架构设计模式的信息。甚至在我知道它是什么之前,我就无意中使用了 MVC 模式,并且仍然在我的日常工作中使用它。从我所见,它可能是当今最流行的模式。不过,我没有听到太多关于您可以使用替代 MVC 的替代模式。有哪些选项,您会出于什么原因决定在 MVC 上使用它们?我也有兴趣了解它们通常用于的系统类型。最后,使用它们的优点和缺点是什么?
asp.net - 使用 MVP - 如何正确使用事件进行测试
我刚刚开始在我正在构建(实际上是重新构建)的大型 ASP.NET 应用程序中使用 MVP 模式,我很难弄清楚我应该如何使用应用于视图的事件。
假设我在用户控件中有 2 个下拉列表,其中一个取决于另一个的值:
接口中应该如何定义 AutoPostBack 事件?它是否应该是由用户控件处理的事件,如下所示:
还是应该在接口上定义一个事件?如果这是首选模式,我该如何添加要处理和使用的事件?
unit-testing - 在测试基于 MVC 的 UI 时,您常用的测试设置有多少?
我正在尝试测试一个简单的基于 WebForms (asp.net) 的 UI,并遵循 MVP 模式以使我的 UI 更具可测试性。
当我遵循后端算法的 TDD 方法时,我发现有一些单元测试重构是本着 DRY 原则(不要重复自己)的精神发生的。当我尝试使用 Rhino Mocks 将其应用于 UI 以验证我的交互时,在设置视图或模型期望时,我在 Controller 测试中看到了许多共性。
我的问题是:如果有的话,你通常会在多大程度上进行这种重构?我很想知道其他 TDDer 如何测试他们基于 MVC/MVP 的 UI。
silverlight - Silverlight 2 和 MVP 模式
关于如何让 MVP 与 Silverlight 一起工作的任何想法?我如何解决没有引发加载事件的事实?
这是我的观点:
还有我的主持人:
什么都没发生,因为 Loaded 事件似乎没有被调用,我该如何解决这个问题?
asp.net - 如何集成 ASP .Net Model View Presenter (MVP) 模式和标记为 [WebMethod] 的静态页面方法?
在一个 asp.net 应用程序中,我想将 Webclient Software Factory (WCSF) 及其关联的 Model View Presenter 模式 (MVP) 的使用与 Page Method 结合起来,即 .aspx 视图上标有[WebMethod] 属性。
但是,aspx 页面上的静态方法似乎破坏了模型视图演示者模式,因为页面上需要一个实例方法来获得视图与之对话所需的演示者和控制器的上下文。
如何在 WCSF 中扩展 asp .net 的 MVP 模式以支持页面上的 [WebMethods],也就是视图?
asp.net - MVP 模式 - 被动视图和通过 IView (Asp.Net, Web Forms) 公开复杂类型
我最近使用被动视图方法切换到 MVP 模式。当视图界面仅公开基本的 clr 类型时,我觉得使用起来非常舒服,例如映射到 TextBoxes 的字符串、映射到 DropDownLists 的 IDictionary、映射到某些网格的 IEnumerable、转发器。
但是,这最后一种方法只有在我只关心一个列的那些网格中才有效。如何在 IView 中映射网格的多行内容?现在,我想到了两个解决方案,都不是很好:
- 为网格的内容创建一个 DTO 并在 IView 中公开 IEnumerable,或者
- 在 IView 中公开 IEnumerable 或仅公开“网格”。
第一个解决方案似乎打破了被动视图规则,同时更接近于监督控制器模式,第二个解决方案完全打破了整个 MVP 模式。你会怎么处理这个?
谢谢, Łukasz
.net - WinForms:让我的 UI 独立于我的 BLL 层运行的实施问题?
我正在尝试以 MVP 风格做一个 Windows 窗体应用程序 - 之前没有对线程做太多工作 - 我感到很困惑。
我的 UI 是一组非常简单的表单。每个表单都实现了一个接口并包含对位于业务逻辑层中的中介类的引用,反之亦然。所以简化图如下所示:
如您所见,中介类控制 UI,告诉它何时显示数据、启动、关闭等。它们甚至表示模式对话框何时出现以及何时关闭(即上面的 PleaseWaitDialog)。 UI 所做的是在屏幕上显示数据并将输入中继回中介。
这种架构很好且解耦,并且非常容易测试和原型化。现在我将它们放在一起,但是我开始遇到线程问题。例如,如果我希望我的 PleaseWaitDialog 在 CheckInForm 上显示为模式表单(使用 ShowDialog()),直到由中介控制的计时器计数 5 秒(请记住,这是一个简化)我会得到一个跨线程错误如果我从计时器的回调中调用 PleaseWaitDialog.Close() 。同样,如果我有一个模式对话框阻止用户与 UI 交互,我不希望它阻止业务层中的活动,除非我另有说明(例如使用确认对话框)。
我想我想做的是在主线程上运行中介和业务逻辑,在一个完全独立的线程上运行 UI,我的第一个问题是这样做有意义吗?
我的第二个问题是,我该如何做一些事情,比如让一个类在一个单独的线程中运行?我如何让两者沟通?我正在阅读 .NET 线程,但我有一个截止日期和一些示例,说明如何在主线程上生成一个包含 UI 的线程并让它们的对象相互交谈真的很有帮助。
model-view-controller - 新的 Web 应用程序应该遵循 MVC 还是 MVP 模式?
请注意,我不是问选择哪一个(MVC 或 MVP),而是问是否应该将两者之一用于 Web 应用程序。
我意识到将旧应用程序从其当前设计转换为 MVC 或 MVP 模式可能需要做太多工作。但是,对于新应用程序呢?看起来这些是最流行的架构模式,那么应该选择其中一种吗?如果不是,还有哪些其他模式?
如果您不熟悉 MVC 和/或 MVP,一个很好的问题是“什么是 MVP 和 MVC,有什么区别?” . 它有很多很好的答案,包括指向各个网站的链接,这些网站会分解每个网站。