ASP.NET MVC项目中设置数据访问的最佳方法是什么?

7
我正在启动一个新的ASP.NET MVC项目来学习,并且想知道连接SQL服务器以获取数据的最佳方式是什么。例如,假设我们有一个产品表和一个产品对象,我想用它来填充我的视图。
我知道在这里应该有一个被实现的接口等,但今天我无法理解它。
编辑:目前(即此应用程序的当前版本)我只使用普通的SQL Server(甚至是2000),仅使用存储过程进行数据访问,但我不反对添加一层灵活性以使用Linq to SQL或其他内容。
编辑#2:我想要补充一件事情:我将根据数据库的V1编写代码,并且需要能够让我们的DBA重新设计数据库并在以后给我V2,因此最好只更改一些小细节,而不是必须重新编写整个DAL。
10个回答

4
这真的取决于您使用的数据访问技术。如果您使用的是Linq To Sql,您可能希望在某种“存储库”接口后面抽象出数据访问,例如IProductRepository。这样做的主要吸引力在于您可以随时更改特定的数据访问实现(例如编写单元测试)。
我已经试图在这里涵盖一些内容: 这里

3
我建议您观看Rob Conery关于他创建MVC商店前端的视频。该系列视频可以在此处找到:MVC商店前端系列
该系列视频深入探讨了与MVC和其他项目一起使用的各种设计相关主题以及编码/测试实践。

1

我已经完成了几个MVC应用程序,并找到了一种非常适合我的结构。它基于JPrescottSanders提到的Rob Conery's MVC Storefront Series(尽管他发布的链接是错误的)。

所以,我通常尝试将控制器限制为仅包含视图逻辑。这包括检索要传递给视图的数据以及从视图传回的数据映射到域模型。关键是尝试将业务逻辑排除在此层之外。

为此,我通常会在应用程序中使用3个层。第一个是表示层-控制器。第二个是服务层-该层负责执行复杂查询以及诸如验证之类的事情。第三层是存储库层-该层负责所有对数据库的访问。

所以在你的产品示例中,这意味着你将拥有一个ProductRepository,其中包含GetProducts()和SaveProduct(Product product)等方法。你还将拥有一个ProductService(依赖于ProductRepository),其中包含GetProductsForUser(User user),GetProductsWithCategory(Category category)和SaveProduct(Product product)等方法。像验证之类的事情也会在这里发生。最后,你的控制器将依赖于你的服务层来检索和存储产品。

你可以跳过服务层,但通常会发现你的控制器变得非常臃肿,往往做太多的事情。我已经尝试过这种架构很多次,它往往运行得非常好,特别是因为它非常支持TDD和自动化测试。


1
在我的网站解决方案中,我有MVC Web应用程序项目和一个“common”项目,其中包含我的POCO(普通的C#对象)、业务管理器和数据访问层。
DAL类与SQL Server绑定(我没有将它们抽象出来),并将POCO返回给业务管理器,我从MVC项目中的控制器调用它们。

我猜我正在努力理解的问题之一是,你们在共同项目中使用的对象与应该放在模型文件夹中的对象之间有什么区别?或者说,这个共同项目是否取代了将东西塞进模型中的做法? - Ryan Skarin
我可能完全错了(我是MVC的新手),但我会使用Models文件夹来创建我的“常见”对象的混搭,以供视图特定使用。 - brock.holum
所以,如果您的常见对象需要执行基本常见对象未提供的操作,您基本上会在模型文件夹中扩展它们? - Ryan Skarin
如果我需要一个特定于MVC应用程序的对象,我会将其放在Models文件夹中。然而,我在asp.net上发现了这句话,让我觉得我是错的:“模型应该包含所有应用程序业务逻辑和数据库访问逻辑。” http://www.asp.net/learn/mvc/tutorial-02-cs.aspx - brock.holum
也许我想得太多,把事情分成不同的项目可能只需要分离不同的cs文件就可以了。 - Ryan Skarin

1

我认为Billy McCafferty的S#arp Architecture是一个非常好的例子,展示了如何使用ASP.NET MVC与数据访问层(默认使用NHibernate)、依赖注入(目前使用Ninject,但计划支持CommonServiceLocator)和测试驱动开发。该框架仍在开发中,但我认为它相当不错且稳定。在当前版本中,应该不会有太多破坏性变化,直到最终发布之前,所以对其进行编码应该没问题。


0

我认为你需要一个ORM。

例如Entity Framework(Code First)。

你可以创建一些用于模型的类。

使用这些模型来处理逻辑和视图,并将它们映射到数据库(v1)。

当DBA提供新的数据库(v2)时,只需更改映射配置即可(v1和v2都是关系型数据库,如SQL Server、MySQL、Oracle等)。如果DB(v1)是关系型数据库,而DB(v2)是NoSQL数据库(如Mongo、Redis、Couchbase等),那么就无法工作。

可能需要进行一些查找和替换。


0

对于我们的应用程序,我计划使用LINQ to Entities,但由于这对我来说是新的,如果它的性能不如我所愿,我可能会想要将其替换为其他东西,比如LINQ to SQL或NHibernate,因此我将把数据访问对象抽象成一个抽象工厂,以便实现对应用程序的隐藏。

你如何做取决于你,只要选择一个经过验证和广为人知的设计模式进行实现,我认为你的最终产品将得到良好的支持和稳健性。


0

请查看Code Camp Server,这是一个很好的参考应用程序,可以完成此操作,正如@haacked所述,将其抽象化以保持它们分离。


0
使用LINQ。创建一个LINQ到SQL文件,然后拖放所有需要的表和视图。当您调用模型时,所有CRUD级别的内容都会自动为您创建。
LINQ是我长期以来看到的最好的东西。这里有一些从Scott Gu的博客中获取数据的简单示例。 LINQ教程

0

我刚刚完成了我的第一个MVC项目,使用了Service-Repository设计模式。现在网络上有很多关于它的信息。这使得我从Linq->Sql到Entity Framework的转换变得轻松。如果你认为你会经常更改,请花费一点额外的努力来使用接口。

我建议您使用Entity Framework作为您的DAL/Repository。


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