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

时间:2008-09-22 18:58:55

标签: c# asp.net asp.net-mvc visual-studio visual-studio-2008

我正在开始一个新的ASP.NET MVC项目来学习,并且想知道设置项目连接到SQL服务器以获取数据的最佳方式是什么。例如,假设我们有一个Product表和一个产品对象,我想用它来填充我视图中的数据。

我知道在这里的某个地方我应该有一个可以实现的界面,但是我今天无法理解它: - (

编辑:现在(即:此应用程序的当前编码不佳的版本)我只使用普通的旧SQL服务器(2000甚至)仅使用存储过程进行数据访问,但我不会不喜欢添加使用linq到sql或其他东西的额外灵活性。

编辑#2:我想添加的一件事是:我将针对数据库的V1写这个,我需要能够让我们的DBA重新运行数据库并在稍后给我一个V2因此,现在只需更改一些现在不会通过数据库提供的小东西真是太好了。而不是必须重写一个全新的DAL。

10 个答案:

答案 0 :(得分:4)

这实际上取决于您使用的数据访问技术。如果您正在使用Linq To Sql,您可能希望抽象出某种“存储库”接口背后的数据访问,例如IProductRepository。对此的主要吸引力在于您可以随时更改特定的数据访问实现(例如在编写单元测试时)。

我试图涵盖this here的一些内容:

答案 1 :(得分:3)

我会在他创建的MVC商店前面查看Rob Conery's个视频。该系列可在此处找到:MVC Store Front Series

本系列课程涉及各种与设计相关的科目,以及用于MVC和其他项目的编码/测试实践。

答案 2 :(得分:1)

在我的网站解决方案中,我有一个MVC Web应用程序项目和一个包含我的POCO(简单的'C#对象),业务经理和数据访问层的“通用”项目。

DAL类与SQL Server绑定(我没有将它们抽象出来)并将POCO返回给我从MVC项目中的控制器调用的业务经理。

答案 3 :(得分:1)

我认为Billy McCafferty的S#arp Architecture是使用ASP.NET MVC和数据访问层(默认使用NHibernate),依赖注入(Ninject atm,但有计划支持CommonServiceLocator)的一个很好的例子。 )和测试驱动的开发。该框架仍处于开发阶段,但我认为它非常好且稳定。截至目前的版本,在最终版本发布之前应该没有什么重大变化,因此对它进行编码应该没问题。

答案 4 :(得分:1)

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

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

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

因此,在您的产品示例中,这意味着您将拥有一个ProductRepository,其中包含GetProducts()和SaveProduct(Product product)等方法。您还可以使用GetProductsForUser(用户用户),GetProductsWithCategory(类别类别)和SaveProduct(产品产品)等方法获得ProductService(依赖于ProductRepository)。像验证这样的事情也会发生在这里。最后,您的控制器将依赖于您的服务层来检索和存储产品。

您可以跳过服务层,但通​​常会发现您的控制器变得非常胖并且往往会做太多。我已经尝试了很多次这种架构,它可以很好地工作,特别是因为它支持TDD和自动化测试。

答案 5 :(得分:0)

对于我们的应用程序,我计划使用LINQ to Entities,但是因为它对我来说是新的,如果它没有按照我的意愿执行并且使用像LINQ这样的其他东西,我将来可能会想要替换它对于SQL或NHibernate,所以我将数据访问对象抽象为抽象工厂,以便实现对应用程序隐藏。

如何做到这一点取决于您,只要您选择经过验证且知名的设计模式来实施,我认为您的最终产品将得到良好支持和强大。

答案 6 :(得分:0)

查看Code Camp Server以获得一个很好的参考应用程序来执行此操作,并且@haacked声明抽象,以便将它们分开。

答案 7 :(得分:0)

使用LINQ。创建LINQ to SQL文件并拖放所需的所有表和视图。然后,当您调用模型时,将自动为您创建所有CRUD级别的内容。

LINQ是我在很长一段时间里看到的最好的东西。以下是一些从Scott Gu的博客中获取数据的简单示例。

LINQ Tutorial

答案 8 :(得分:0)

我刚刚完成了我的第一个MVC项目,并使用了Service-Repository设计模式。现在网上有很多关于它的信息。它使我从Linq-> Sql过渡到Entity Framework毫不费力。如果您认为自己将要进行大量更改,请花费额外的精力来使用Interfaces。

我推荐您的DAL / Repository的Entity Framework。

答案 9 :(得分:0)

我认为你需要一个人。

例如实体框架(代码优先)

你可以为模型创建一些类。

将这些模型用于逻辑和视图,并将它们映射到db(v1)。

当dba给你新的db(v2)时,只更改映射配置。(v1和v2都是rdb,sql server,mysql,oracel ...),如果db(v1)是rdb和db(v2) )是一个nosql(mongo,redis,couchbase ......),这是行不通的

可能需要做一些查找和替换