MVC架构和三层架构的区别是什么?我需要一些澄清。

11
我一直在阅读《Pro ASP NET MVC Framework》这本书,但是有很多东西令我感到困惑。虽然我一直在尝试做一些研究,但是发现有太多不同的方法和概念被介绍给我,反而让事情变得更糟。
所以我有几个问题:
  1. 我知道MVC应该将功能拆分为三个主要部分:模型->控制器->视图。MVC是否与三层架构不同?或者我还应该考虑在项目中创建数据访问层和业务逻辑层?

  2. 什么是存储库?它是我的数据访问层吗?存储库在MVC中如何运作?

  3. 该书谈到使用LINQ to SQL与数据库交互,但它指出LINQ to SQL将不再受到支持,微软正在放弃它并转向Entity Framework。Entity Framework在MVC中扮演什么角色,我该如何与之交互?

先感谢你的帮助!
Matt


6
LINQ to SQL不会被抛弃,你的书在第49页上也明确说明了这一点。 - mmcdole
另外,就MVC和三层架构的区别而言,我建议您重新阅读第41页顶部的最后一段落。 - mmcdole
我看到它将被包含在ASP.NET 4.0中,但我认为它仍在慢慢地被淘汰。好的,是的,我确实读了那一段。就像我说的,由于所有术语和概念都一下子扔给我,我有点混乱,并忘记了我读过的一些东西。谢谢。 - Matt
@Matt,我认为这本书不适合领域内真正的初学者。并不是说这不是一本好书,我真的很喜欢它。但是,“Pro ASP.NET MVC”就是那样一本更适合老手的书。如果我之前没有反复介绍过大多数这些概念,我也会感到困惑。 - mmcdole
1
@Matt,LINQ将长期与我们同在。Entities很好,但大多数人仍然会使用LINQ to Entities,因此学习和使用LINQ并不是一个坏选择。 - mmcdole
@Matt,或者你可以看一下Scott Gu在NerdDinner上的演示,而不是购买另一本书(这仍然是一个好主意)。之后你可以继续阅读手头的书。http://nerddinnerbook.s3.amazonaws.com/Intro.htm - Ahmed
4个回答

7
  1. MVC主要是一种用于展示层的模式,它关注视图和控制器之间的交互。模型可以被认为是应用程序维护状态的组件,包括持久化。

    在一个简单的应用程序中,模型可能只是一个LINQ-To-SQL模型。在一个大型企业应用程序中,模型可能包含数据访问层、业务层和域层。ASP.NET MVC不限制M应该如何实现。

  2. 仓储模式是实现M中持久化部分的一种方式。ActiveRecord是另一种方式。选择哪种模式取决于应用程序的复杂性和您的偏好。

    看看NerdDinner教程的第3步,他们使用Linq to SQL创建了一个简单的仓库。

  3. Linq to SQL不会死亡。微软仍将改进核心并添加客户请求,如果有意义的话,但Entity Framework将成为主要关注点。查看此帖子了解.NET 4.0中的LINQ to SQL更改

    EF可以像LINQ to SQL一样使用,但它也更加灵活,因此可以以其他方式使用。例如,EF4将支持以更多领域驱动设计的方式持久化您自己的POCO对象。


非常信息丰富的答案。我应该能够给这个答案投3次赞! - Martin

6
是的,我认为MVC是一种不同于你在这里指的“三层架构”(主要创建三个项目DAL、BL和UI)的方法。 MVC背后的主要思想是在其各个组件(模型、视图和控制器)之间分离关注点。控制器是处理用户请求的组件,在大多数情况下,它与“模型”组件合作,以响应用户请求显示所需的视图。与传统的三层架构不同的是,现在将DAL和BL分组并命名为Model,并且是的,您仍然需要创建这些组件。
什么是repositories?
Martin Fowler提到了repository的定义为“使用类似集合的接口来访问域对象,从而在域和数据映射层之间进行中介”。Repositories是数据访问层的一部分,它们本身不访问数据,而是在域和数据映射实体之间进行中介,并且当然应该放置在您的Model文件夹/项目中。

Linq to SQL会过时吗?
不会过时,同一本书也如此说明,ADO.NET团队的开发人员Damien Guard在他的博客文章中也提到,Linq to SQL将包含在.NET 4.0中。

如何与EF交互?
就像使用Linq to SQL一样。与Linq to SQL一样,Entity Framework将是您的映射实体,并且也将驻留在Model项目中。
希望这可以帮助到您!


1

我猜你对这些事情有点困惑,它们确实很令人困惑,所以让我们慢慢来。

  1. N-Tiered Architecture和MVC是不同的,但相互交织在一起。 N-Tier通常涉及将数据访问、业务逻辑和用户界面分离。然而,有些人可能会认为完全将BLL与UI分离是不可能的;MVC以这样的方式解决了这个问题,即有一个相应的控制器与您的BLL和视图进行交互,而不是让您的视图直接与BLL进行交互。

  2. 是的,拥有存储库是实现DAL的一种方法。 有许多做法,您不应该局限于书中讨论的内容。

  3. 该书仅使用LINQ to SQL来演示ASP.NET MVC最快的方法,但这不是唯一的方法。 暂停考虑LINQ to SQL一分钟;无论您使用像NHibernate这样的ORM还是使用纯ADO.NET + DAL Factory或其他任何东西,都可以使用ASP.NET MVC -- 您将无法使用那些您可以拖放到UI中的ASP.NET ObjectDataSources

关于Entity Framework,Brad Abrams撰写了一份很好的指南如何在ASP.NET MVC中使用Entity Framework,这应该可以回答你的最后一个问题。
希望对你有所帮助。

-1
  1. 是的,您仍然需要自己创建数据访问和业务逻辑层。有些人可能会认为控制器层就是业务逻辑,但我个人更喜欢将真正的业务逻辑(例如定价计算)与屏幕业务逻辑(例如“确定”按钮的事件处理程序)分开。然后您将从控制器类中调用这些内容。控制器类控制屏幕逻辑并管理从数据/业务逻辑层到屏幕值的转换。

  2. ASP.NET MVC框架对“模型”层没有任何限制,这意味着您可以使用任何您想要的东西,包括NHibernate、LINQ to SQL或实体框架。我使用LINQ to SQL因为它很简单。

  3. 不确定,从未读过那本书。我只是从codeplex下载了Scott Hanselman的Nerddinner项目,并将其用作编写ASP.NET MVC网站的指南。


首先,我称之为“模型”层,因为这个问题涉及MVC。其次,就像我在第一点中所说的,我也在“模型”层处理“业务逻辑”,因此它不仅仅涉及持久性。 - oscarkuo
这样说吧,如果你把所有的业务逻辑都放在模型层中,那么你如何在另一个程序中重用它呢?这是否意味着你必须从你的程序中添加对网站的引用,以便你可以调用该方法?这没有任何意义,是吧? - oscarkuo
所有关于Web的细节都不是Model的一部分,而是View的一部分。因为那不是业务逻辑,而是展示逻辑和细节。现在,我希望您可以使用一些不同的视图技术来使用您的模型。 - Adeel Ansari
@Vinegar。持久性由ASP.NET MVC回答,它是M. Scott Gu(ASP.NET MVC的架构师)所写的“在基于MVC的应用程序中,“模型”是负责维护状态的应用程序组件。通常,这种状态会持久保存在数据库中。” - BengtBe
@Vinegar ASP.NET MVC基本上是相同的,当你第一次创建MVC项目时,模型层基本上是空的,没有生成任何内容,而且你可以选择用什么来作为你的模型层。有人开玩笑地说ASP.NET MVC实际上只是ASP.NET VC。 - oscarkuo
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接