为 ASP.NET MVC 项目设置数据访问的最佳方式是啥?

Posted

技术标签:

【中文标题】为 ASP.NET MVC 项目设置数据访问的最佳方式是啥?【英文标题】:What's the best way to set up data access for an ASP.NET MVC project?为 ASP.NET MVC 项目设置数据访问的最佳方式是什么? 【发布时间】:2010-09-12 02:52:45 【问题描述】:

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

我知道在这里的某个地方我应该有一个可以实现的接口,等等,但我今天无法完全解决它:-(

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

编辑 #2:我想添加的一件事是:我将针对数据库的 V1 编写此内容,并且我需要能够让我们的 DBA 重新处理数据库并稍后给我一个 V2 ,所以现在只需要更改一些未通过数据库提供的小东西,这将是很好的。而不必重新编写一个全新的 DAL。

【问题讨论】:

【参考方案1】:

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

我试图覆盖一些this here:

【讨论】:

【参考方案2】:

我会查看 Rob Conery's 视频,了解他创建 MVC 店面。该系列可以在这里找到:MVC Store Front Series

本系列深入探讨各种与设计相关的主题以及用于 MVC 和其他项目的编码/测试实践。

【讨论】:

【参考方案3】:

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

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

【讨论】:

我想也许我试图理解的一些问题是常见项目中的对象与应该放在模型文件夹中的对象之间有什么区别?还是这个常见的项目会取代将东西填充到模型中? 我可能完全错了(我是 MVC 新手),但我会使用 Models 文件夹来创建我的“通用”对象的混搭,以供视图特定使用。 因此,如果模型文件夹中的公共对象需要执行基本公共对象中未提供的操作,您基本上会扩展它们? 如果我需要一个特定于 MVC 应用程序的对象,我将它放在 Models 文件夹中。然而,我在 asp.net 上发现了这句话,这让我觉得我错了:“模型应该包含你所有的应用程序业务逻辑和数据库访问逻辑。” asp.net/learn/mvc/tutorial-02-cs.aspx 当单独的 cs 文件真的是我应该做的所有事情时,也许我想太多关于将事物分离到单独的项目中。【参考方案4】:

我认为 Billy McCafferty 的 S#arp Architecture 是一个很好的例子,它使用了带有数据访问层(默认使用 NHibernate)、依赖注入(Ninject atm,但计划支持 CommonServiceLocator)的 ASP.NET MVC 和测试驱动开发。该框架仍在开发中,但我认为它非常好且稳定。从当前版本开始,在最终版本发布之前应该有很少的重大更改,因此针对它进行编码应该是可以的。

【讨论】:

【参考方案5】:

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

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

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

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

你可以跳过服务层而侥幸,但你通常会发现你的控制器变得非常胖并且往往做太多事情。我已经尝试过这种架构很多次了,而且它的效果很好,尤其是因为它很好地支持 TDD 和自动化测试。

【讨论】:

【参考方案6】:

对于我们的应用程序,我计划使用 LINQ to Entities,但由于它对我来说是新的,如果它不能按我的意愿执行并使用其他类似 LINQ 的东西,我可能会想在将来替换它到 SQL 或 NHibernate,所以我将把数据访问对象抽象成一个抽象工厂,以便对应用程序隐藏实现。

您如何做取决于您,只要您选择一种经过验证且广为人知的设计模式来实施,我认为您的最终产品将得到很好的支持和健壮。

【讨论】:

【参考方案7】:

使用 LINQ。创建一个 LINQ to SQL 文件并拖放您需要的所有表和视图。然后,当您调用模型时,所有 CRUD 级别的东西都会自动为您创建。

LINQ 是我很久以来见过的最好的东西。以下是从 Scott Gu 的博客中获取数据的一些简单示例。

LINQ Tutorial

【讨论】:

【参考方案8】:

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

我为您的 DAL/存储库推荐实体框架。

【讨论】:

【参考方案9】:

查看Code Camp Server 以获得一个很好的参考应用程序,它可以做到这一点,正如@haacked 所说的摘要,它可以将它们分开。

【讨论】:

【参考方案10】:

我认为你需要一个 orm。

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

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

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

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

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

【讨论】:

以上是关于为 ASP.NET MVC 项目设置数据访问的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用存储库时,ASP.NET MVC 中业务逻辑的最佳位置是啥?

ASP.NET MVC 的最佳存储库模式

ASP.NET MVC如何设置路由启动

asp.net mvc项目中,为何在iis6上显示404错误,是何原因造成

ASP.NET MVC 3、Razor 视图和可移植区域

七天学会ASP.NET MVC ——ASP.Net MVC 数据处理