Questions tagged «mvc»

MVC(模型-视图-控制器)是一种软件体系结构模式,可强制将关注点分离。

14
您是否应该将后端编写为API?
今天,我对我们的MVC应用程序进行了热烈的讨论。我们有一个用MVC(ASP.NET)编写的网站,它通常遵循在视图中执行某些操作的模式->击中控制器->控制器构建模型(调用获取数据的Manager,在该模型中构建模型控制器方法本身)->模型去查看->冲洗并重复。 他说我们的代码太紧密了。例如,如果我们还需要桌面应用程序,则将无法使用现有代码。 他说的解决方案和最佳实践是构建一个API,然后在您的API之上构建您的网站,然后构建一个桌面应用程序,移动应用程序等非常简单。 由于种种原因,这对我来说似乎是个坏主意。 无论如何,我似乎无法通过谷歌搜索找到任何讨论这种做法的东西。是否有人对优缺点有任何了解,为什么要这样做,为什么不应该这样做或需要进一步阅读? 我认为这是一个坏主意的一些原因: 太抽象了,无法通过API运行后端。您正在尝试使其过于灵活,这将使其变得难以处理。 MVC中内置的所有内容似乎都无用,例如角色和身份验证。例如,[授权]属性和安全性;您将不得不自己动手。 您的所有API调用都需要附加安全信息,并且您将必须开发令牌系统等等。 您将必须为程序将要执行的每个功能编写完整的API调用。您几乎要实现的每种方法都需要使用API​​。每个用户的Get / Update / Delete,以及每个其他操作的变体,例如更新用户名,将用户添加到组等,等等,每个将是一个不同的API调用。 当涉及到API时,您会丢失各种工具,例如接口和抽象类。WCF之类的东西对接口的支持非常微弱。 您有一个创建用户或执行某些任务的方法。如果要创建50个用户,则只需调用50次即可。当您决定将此方法用作API时,本地Web服务器可以命名管道连接到它,也没有问题-您的桌面客户端也可以访问它,但是突然间,您的批量用户创建将涉及在Internet上锤击该API 50次,不好 因此,您必须创建一个批量方法,但实际上您只是在为桌面客户端创建它。这样,您最终不得不a)根据与其集成的API修改API,而不能直接与其进行集成,b)做更多的工作来创建一个额外的功能。 YAGNI。除非您专门计划编写两个功能相同的应用程序,例如一个Web和一个Windows应用程序,否则这将是大量的额外开发工作。 当您无法端对端进行调试时,调试会困难得多。 许多独立的操作将需要大量的来回操作,例如,某些代码可能会吸引当前用户,检查该用户是否具有管理员角色,获取该用户所属的公司,获取其他成员的列表,并将其全部发送出去一封电邮。这将需要大量的API调用,或者为您想要的特定任务编写定制方法,而该定制方法的唯一好处是速度快,但缺点是不灵活。 可能还有其他一些原因,这些都不在我脑海中。 在我看来,除非您真的需要两个相同的应用程序,否则确实不值得。我也从未见过这样构建的ASP.NET应用程序,您必须编写两个单独的应用程序(API和您的代码),并同时对它们进行版本控制(如果您的用户页面有一个新字段,则d必须同时更新API和您使用的代码,以确保不会产生不良影响,或进行大量额外的工作以保持其健壮性)。 编辑:一些不错的回应,现在真的开始对这一切意味着什么有了一个好主意。因此,为了扩展我的问题,您将如何构建一个MVC应用程序以遵循此API结构? 例如,您有一个显示有关用户信息的网站。在MVC下,您可以: 视图-(CS)HTML页面,其中显示一个UserViewModel控制器-调用GetUser()并创建一个UserViewModel,并将其传递给具有GetUser方法的视图管理器类(与您的API相似)。 控制器执行GetUser(),但您也需要桌面应用程序。这意味着您的GetUser需要通过某种API公开。您可能需要TCP连接,或者是WCF,或者可能是Remoting。您还需要一个将是RESTful的移动应用程序,因为持久性连接不稳定。 那么,您是否会为每个API编写一个API,一个具有方法GetUser()的WCF Web服务,而代码恰好return new UserManager().GetUser()呢?和做同样事情的MVC 4 Web API方法呢?在继续直接在您的MVC控制器方法中调用GetUser时? 还是您会选择适用于所有三个应用程序的解决方案(Web api REST服务)并在其上构建所有内容,因此所有三个应用程序都进行API调用(对本地计算机的mvc调用)。 这仅仅是理论上的完美场景吗?我可以看到以这种方式进行开发的开销很大,尤其是如果您必须以一种允许您以RESTful方式进行操作的方式进行开发时。我认为其中一些已包含在答复中。 编辑2:在阅读更多内容之后,我在下面提出了一条评论,我认为这可能会解释它。我认为这个问题有点棘手。如果您将后端编写为API,让我感到困惑,我认为应该有一个单一的Web服务,所有东西(MVC应用程序,桌面应用程序,移动应用程序)都可以调用来完成工作。 我得出的结论是,您真正应该做的是确保业务逻辑层正确分离。查看我的代码,我已经这样做了-控制器将调用GetUser()管理器,然后从中创建一个视图模型以使用View进行渲染。因此,实际上,业务逻辑层是一个API。但是,如果要从桌面应用程序调用它,则需要编写WCF服务之类的内容以方便调用它。即使仅调用GetUser()一个包含代码的WCF方法return MyBusinessLayer.GetUser()就足够了。因此,API是业务逻辑,而WCF / Web api等只是让外部应用程序调用它的一小部分代码。 因此存在一些开销,因为您必须根据需要将业务逻辑层包装在不同的API中,并且必须为希望其他应用程序执行的每个操作编写API方法,此外,您还需要找出一种进行身份验证的方法,但在大多数情况下是相同的。将您的业务逻辑放在一个单独的项目(类库)中,您可能不会有任何问题! 希望这种解释是正确的。感谢它产生的所有讨论/评论。

10
真正的MVC是什么?
作为一名认真的程序员,您如何回答MVC是什么? 在我看来,MVC是一个模糊的主题,因此,如果您的受众是学习者,那么您可以自由地以不太可能引起争议的通用术语来描述它。 但是,如果您是在与知识渊博的听众(尤其是采访员)交谈时,我很难考虑采取这样的方向,而不会冒“不正确!!”的反应。我们都有不同的实际经验,而且我还没有真正两次遇到相同的MVC实现模式。 具体来说,似乎在严格性,组件定义,零件分离(适合什么地方)等方面存在分歧。 因此,我该如何以正确,简洁和无争议的方式解释MVC?

7
为什么要使用MVC模式?
如今,每个使用Web应用程序的人似乎都希望对所有内容使用MVC。但是,我很难说服自己使用这种模式。我了解一般的想法是将代表程序的后端逻辑与前端逻辑分开。通常,视图在一定程度上似乎总是依赖于控制器,最终取决于模型。我看不出添加控制器能给我带来什么好处。我已经读过很多关于“这是应用程序应该被设计的方式”的大肆宣传,但是也许我仍然不明白应该去哪里。每当我与其他人谈论MVC时,似乎每个人对于什么属于什么类别都有不同的想法。 那么,为什么要使用MVC?通过将MVC仅仅从前端逻辑和后端逻辑中分离出来,我可以获得什么?(我看到的这种模式的大多数“优势”都是通过将接口与实现分开来获得的,而无法解释拥有单独的“控制器”的目的)

5
为什么要在模型中加入业务逻辑?当我有多种类型的存储时会怎样?
我一直认为业务逻辑必须在控制器中,并且控制器(因为它是“中间”部分)保持静态,并且模型/视图必须通过接口进行封装。这样,您可以在不影响任何其他因素的情况下更改业务逻辑,对多个模型(每个数据库/存储类型一个)进行编程,并为多个视图(例如针对不同的平台)编程。 现在,我在这个问题中读到,您应该始终将业务逻辑放入模型中,并且控制器与视图紧密相连。 对我来说,这没有任何意义,它意味着每次我想拥有一种支持另一种数据库/存储类型的方法时,都必须重写包括业务逻辑在内的整个模型。 如果我想要另一个视图,则必须重写视图和控制器。 有人可以解释为什么会这样,还是我在某个地方出错了?

13
为什么“较低”的应用程序层不了解“较高”的层是一个好主意?
在典型的(设计良好的)MVC Web应用程序中,数据库不知道模型代码,模型代码不知道控制器代码,并且控制器代码不知道视图代码。(我想您甚至可以从硬件开始甚至更远的地方开始,而且模式可能相同。) 换个方向,您只能向下移动一层。视图可以知道控制器,但不能知道模型。控制器可以知道模型,但不能知道数据库;该模型可以识别数据库,但不能识别操作系统。(更深层次的内容可能无关紧要。) 我可以直观地理解为什么这是一个好主意,但我无法明确表达。为什么这种单向分层样式是个好主意?

14
MVC不是OOP吗?
OOP背后的主要思想是统一单个实体(对象)中的数据和行为。在过程编程中,有数据和修改数据的单独算法。 在“模型-视图-控制器”模式中,数据和逻辑/算法分别放置在不同的实体中,分别是模型和控制器。在等效的OOP方法中,模型和控制器不应该放在同一逻辑实体中吗?

8
MVC体系结构—我需要多少个控制器?
我已经编码了一段时间,但主要是脚本和简单的应用程序。我已经升任新职位,其职责是开发Web应用程序并使用适当的MVC架构,因此我拼命尝试快速了解所有内容。 我希望这个问题与“ MVC体系结构的最佳实践 ”不太相似,但是当我浏览一些不同的教程时,我注意到其中有些具有针对不同事物的多个控制器。 一个Web应用程序需要多少个控制器? 我意识到如果没有示例,这将很难回答,因此我将提供一个示例: 应用: 用户登录。 用户可以做以下三件事之一: a) 上传一个文件(与元数据一起存储在mongodb数据库中)。 b) 搜索文件。 c) 注销。 我的问题很笼统,但我举了一个例子来帮助任何想回答的人。

2
与MVC相比,MVP有哪些改进?
我已经阅读了三天的有关Model-View-Controller(MVC)和Model-View-Presenter(MVP)模式的信息。有一个问题令我非常困扰。当已经有MVC时,为什么软件设计者会发明MVP? 他们遇到了什么问题,MVC无法解决(或解决得很差),但是MVP可以解决?MVP打算解决哪些问题? 我已经阅读了很多有关MVP的历史和解释,或者关于MVC和MVP之间差异的文章,但是没有一个对我的问题有明确的答案。 在我读过的一篇文章中,有人说: 现在进入Model View Presenter,这是对MVC模式应用于现代基于组件的图形用户界面时的不足之处的回应。在现代GUI系统中,GUI组件本身而不是某些中央控制器来处理诸如鼠标移动和点击之类的用户输入。 因此,我听不懂,但实际上可以以另一种方式使用,例如GUI组件不能自行处理用户输入吗?“单独处理”到底是什么意思?

11
在域丰富的应用程序中检索报告和仪表板数据的最佳实践或设计模式
首先,我想说这似乎是一个被忽略的问题/领域,因此,如果这个问题需要改进,请帮助我将此问题变成一个有益于他人的好问题!我正在寻求实施解决方案的人员的建议和帮助,而不仅仅是尝试的想法。 根据我的经验,应用程序有两个方面-“任务”方面,这主要是域驱动的,用户可以在其中与域模型(应用程序的“引擎”)进行丰富的交互,而报告方面则是用户根据任务侧发生的情况获取数据。 在任务方面,很显然,具有丰富域模型的应用程序应在域模型中具有业务逻辑,并且数据库应主要用于持久性。分离关注点,每本书都为此而写,我们知道该怎么做,太好了。 报告方面呢?数据仓库是可以接受的,还是由于将业务逻辑合并到数据库以及数据本身而设计不当?为了将数据库中的数据聚合到数据仓库数据中,您必须对数据应用业务逻辑和规则,并且该逻辑和规则不是来自您的域模型,而是来自您的数据聚合过程。错了吗 我致力于业务逻辑广泛的大型财务和项目管理应用程序。在报告这些数据时,我经常会做很多汇总工作以提取报告/仪表盘所需的信息,并且这些汇总中有很多业务逻辑。为了提高性能,我一直在使用高度聚合的表和存储过程进行此操作。 例如,假设需要一个报告/仪表板来显示活动项目的列表(设想10,000个项目)。每个项目将需要显示一组指标,例如: 总预算 迄今为止的努力 燃烧率 以当前消耗率计算的预算用尽日期 等等 这些都涉及很多业务逻辑。我不仅在谈论乘数或一些简单的逻辑。我说的是为了获得预算,您必须应用一个包含500个不同费率的费率表,每个费率适用于每个员工的时间(在某些项目中,其他项目具有乘数),应用费用和任何适当的加价等。逻辑是广泛的。为了使客户端在合理的时间内获得大量数据,需要进行大量的聚合和查询调整。 应该首先在域中运行它吗?性能如何?即使使用直接的SQL查询,我也无法获得足够快的数据以使客户端在合理的时间内显示。我无法想象如果要重新为所有这些域对象补水,并在应用程序层中混合,匹配和聚合它们的数据,或者试图在应用程序中聚合数据,那么尝试将这些数据足够快地发送到客户端。 在这些情况下,SQL似乎擅长处理数据,为什么不使用它呢?但是,那么您在域模型之外就有了业务逻辑。对业务逻辑的任何更改都必须在您的域模型和报告聚合方案中进行更改。 对于域驱动设计和良好实践,如何设计任何应用程序的报告/仪表板部分,我实在感到茫然。 我添加了MVC标签,因为MVC是jour的设计风格,并且在我当前的设计中使用了它,但无法弄清楚报告数据如何适合此类应用程序。 我正在寻找这方面的任何帮助-书籍,设计模式,谷歌关键字,文章等等。我找不到有关此主题的任何信息。 编辑和另一个例子 我今天遇到的另一个完美的例子。客户需要为客户销售团队提供报告。他们想要看似简单的指标: 对于每个销售人员,他们迄今为止的年销售额是多少? 但这很复杂。每个销售人员参加了多个销售机会。有些人赢了,有些人没有。在每个销售机会中,都有多个销售人员,每个销售人员根据其角色和参与度分配一定比例的销售功劳。因此,现在想象一下要遍历该域...为每个销售人员从数据库中提取此数据所需要做的对象补液量: 获取所有SalesPeople-> 对于每个获取其SalesOpportunities-> 对于每个获取其销售百分比并计算其销售金额, 然后将所有SalesOpportunity销售金额相加。 这是一个指标。或者,您可以编写一个SQL查询,该查询可以快速有效地完成并对其进行快速调整。 编辑2- CQRS模式 我已经阅读了有关CQRS模式的信息,尽管很有趣,但即使是马丁·福勒(Martin Fowler)也说它未经测试。那么BEEN过去如何解决这个问题。每个人在某个时候或某些时候都必须面对这一点。具有成功记录的既定方法或陈旧方法是什么? 编辑3-报告系统/工具 在这种情况下,要考虑的另一件事是报告工具。Reporting Services / Crystal报表,Analysis Services和Cognoscenti等都希望从SQL /数据库获取数据。我怀疑您的数据稍后会通过您的业务。然而,在许多大型系统中,它们和其他类似的对象仍然是报告的重要组成部分。在这些系统的数据源甚至报告本身中甚至存在业务逻辑的地方,如何正确处理这些数据?

3
在MVC设计中将业务逻辑放在哪里?
我创建了一个简单的MVC Java应用程序,该应用程序通过数据表单将记录添加到数据库中。 我的应用程序收集数据,还对其进行验证和存储。这是因为数据是从其他用户在线获取的。数据本质上大部分是数字。 现在,在要存储到数据库(SQL Server)中的数字数据上,我希望我的应用执行计算并显示结果。用户对如何完成计算不感兴趣,因此必须将其封装。用户必须只能查看简单的计算数据(例如,A列数据减去B列数据除以C列数据)。我知道如何编写存储过程,但是我想要一个三层应用程序。 我希望通过对数据库进行计算来处理作为记录放入数据库中的数据。原始数据应保持不受影响,而新数据(计算后)必须作为新实体记录存储到数据库中。 我应该在哪里编写该后台计算代码?因为它是规则和业务逻辑,所以我应该将其放在新的JavaBeans文件中吗?

5
MVC的劣势是什么?[关闭]
自多年前开始真正组织代码以来,我一直在使用MVC / MV *。我使用它已经很久了,以至于我什至无法想到其他任何方式来构造我的代码,而成为实习生后我做的每一项工作都是基于MVC的。 我的问题是,MVC的劣势是什么?在什么情况下,MVC对项目来说是一个错误的选择,那么(更多)正确的选择是什么?当我查找MVC替代方案时,几乎每个结果都是不同类型的MVC。 为了缩小范围,使之不会关闭,对于Web应用程序来说。我确实在不同项目的后端和前端上工作,所以我不能只说前端或后端。

3
控制器调用存储库而不是服务是不好的做法吗?
控制器调用存储库而不是服务是不好的做法吗? 解释更多: 我发现,在好的设计控制器中,可以调用服务和服务使用存储库。 但有时在控制器中,我不需要任何逻辑,只需要从db中获取并将其传递给视图即可。 而且我可以通过调用存储库来做到这一点-无需调用服务-这是不好的做法吗?

2
混合Angular和ASP.NET MVC / Web API?
我来自使用ASP.NET MVC / Web API,现在我开始使用Angular,但不清楚混合它们的正确方法。 一旦我使用Angular,MVC服务器端概念是否仍然提供任何价值?还是我应该严格使用Web API来纯粹获取角度HTTP调用的数据? 如果VS模板添加了很多我不需要的东西,也许我应该使用更简化的起点吗? 我喜欢严格区分服务器端=纯数据和客户端=纯HTML处理的想法。

6
控制器层中应允许多少业务逻辑存在?
有时,我们的应用程序的控制器代码中表示了一些业务逻辑。通常,这是区分从模型调用什么方法和/或传递它们的参数的逻辑。 另一个示例是控制器中存在的一组实用程序功能,这些功能可以根据一组业务规则来格式化或清除从模型返回的数据。 这行得通,但我想知道它是否在灾难中调情。如果控制器和模型之间共享业务逻辑,则这两层将不再可分离,并且继承代码的人员可能会因与业务逻辑相关的代码位置不均匀而感到困惑。 我的问题是,控制器中应允许多少业务逻辑,以及在什么情况下(如果有)?

7
作为独立的初级开发人员,我如何审查自己的进度[关闭]
我目前在一家2人公司工作,担任主要开发人员。我的老板得到了客户,模拟了一些png设计模板并将其交给我。 这个系统运行良好,我真的很喜欢它。 我从事的项目类型是针对中小型企业的,他们通常需要CMS系统。从头开始开发,我将为客户构建定制的后端,以添加/编辑/删除类别,标签,产品等,然后根据交给我的设计模板将它们输出到前端。随着时间的流逝,项目变得越来越复杂,具有购物车/订购功能和其他常见的电子商务类型功能。 同样,该系统运行良好,我真的很喜欢它。 我的问题是我作为程序员的个人发展。我有很多业余时间阅读编程博客,通过stackexchange进行检查,阅读建议的编程书籍(目前为止在“ The Pragmatic Programmer ”上,到目前为止还算不错),进行脑部锻炼(lumosity.com和khanacademy数学问题),做了很多工作。体育锻炼和其他个人发展型活动。 但我不禁感到,我在反馈,评论方面漏了一点。我的老板很棒,从来没有对我的工作赞不绝口,但是不幸的是他要么忙于检查我的代码,要么说实话,我不认为这是他的专业之一,因此无法提供反馈。 我想知道我在做错什么,在做正确的事情。我是否应该在控制器中添加这么多的逻辑,是否对代码进行足够的调制等? 因此,我所做的就是开发了一个小型的“家庭预算”应用程序,并尝试按照我目前所知道的那样干净有效地进行操作。 我想知道的是,我可以在哪里提交此应用程序,并请一些经验丰富的开发人员提供反馈。这不仅是我的代码的一个子部分,如“ codereview.stackexchange”似乎需要,而且我的整个工作流程都需要批评。 我知道这是一个要问的问题,我希望给出的主要建议是在团队中寻找工作,这当然是我以后将要研究的内容,但是现在我想坚持我的当前做法。就业情况,但只是不想养成太多的坏习惯。 让我知道是否可以提供进一步的信息以帮助澄清,或者如果这不是我事先表示歉意的合适位置。不想使用reddit,因为我觉得这个社区培养了更多经过深思熟虑的回应。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.