我一直在做Java和Ruby(并使用框架),我知道MVC是一种分离代码的方法。问题是,我认为我从未真正以它应有的方式使用它。
第一个问题是:业务逻辑,它是什么意思?业务逻辑是否意味着该应用程序的特殊逻辑?假设您正在构建一个卫星系统。业务逻辑是该Satellite系统独有的代码并使其工作吗?
“域名”是什么意思?就像在域逻辑或域中一样。
“保持模型智能,控制器薄,看起来很笨”。这个陈述清楚地表明我用太多代码加载的控制器是错误的编写方式。
举个例子。如果您有BankAccount
课程。那么这个类是否应该提供行为方法,例如验证等以及getter / setter?
控制器应该做什么?只需将视图中的输入/事件重定向到模型,然后可以更新视图(webframeworks中就是这种情况)。
例如,在Java和JPA中,您有entityManager
用于查找实体,可能对它们执行某些操作等。如果在控制器中使用entitymanager
,还是应该创建另一个层如命名控制器使用的“服务”。但同样,这个服务器层是否属于MVC中的Model?你会如何在Rails中做到这一点?
我认为我没有正确的模型和控制器概念。
答案 0 :(得分:2)
将应用程序视为分层。在处理每一层时,总是要自己想一想,“这层是依赖于它上面的层还是可以独立工作?”这是良好的MVC应用程序的基础。
在考虑MVC样式应用程序中的层时,有一些。
在我看来,层(从上到下)是视图,控制器,业务逻辑和数据访问。
视图可以是来自jQuery的JSP甚至AJAX请求。这是用户与您的应用程序交互的地方。视图将信息发送到业务逻辑层以便工作。
应该编写控制器来收集从视图发送给它的数据,以业务逻辑可以理解的方式对其进行转换,然后将信息传递到业务逻辑层。控制器还可以从业务逻辑层中获取信息,对其进行转换,然后将其发送回视图。这里不应该发生真正的“商业逻辑”。可以将其视为视图和业务对象层之间的代理。这也是验证视图提交的数据的好地方。
业务逻辑是您可以在中间找到的层,通常位于控制器和数据访问层之间。这也可以称为服务层。应该写它不知道什么是调用它。如果写得正确,您可以在独立应用程序中使用此层。这是应该发生许多应用程序智能的地方。很多时候,这一层只是调用数据访问层并将结果返回给控制器。但是,还有许多其他的东西可以用来进行数据处理,计算,数据安全,验证等。
数据访问层应该以这样一种方式编写,即它接受输入,检索适当的数据,将其转换为可用的形式,然后返回它。这一层不应该知道或关心什么是调用它,应该以这种方式编写。同样,该层不应该知道它在Web应用程序或独立应用程序中。这里有很多选项可以使表单或ORM(对象关系映射)框架中的生活变得更简单。如果你的申请是一个微不足道的步骤,你应该考虑使用一个。
在传统意义上,模型可以是业务逻辑层和数据访问层以及随之而来的域对象。
以“BankAccount”为例:
“BankAccount”听起来更像是域对象(数据库中数据的表示),而不是具有逻辑的类。通常,域对象只有getter和setter所需的字段(帐号,余额等)。
用户可能会登录他们的银行网站。登录时,视图将用户名发送到控制器(BankAccountController)。控制器从请求中获取此信息并将其发送到服务层(BankAccountService)。服务层将此信息发送到数据访问层,数据访问层对用户可能拥有的BankAccounts进行查询,并将它们返回到服务层,服务层将它们返回给控制器。控制器将以视图层可以将其显示给用户的某种方式操纵该信息。例如,当用户在账户之间转账时,会发生类似的一系列事件。
希望这有帮助......如果您有任何其他问题或者有些问题不明确,请告诉我。
编辑:
除了其他用户发布的链接外,维基百科还有一篇关于MVC的简短但非常好的文章。
http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller