C# MVC4中数据库方法的最佳实践

C# MVC4中数据库方法的最佳实践,c#,asp.net-mvc-4,.net-4.5,data-access-layer,C#,Asp.net Mvc 4,.net 4.5,Data Access Layer,我是MVC4的新手,到目前为止,我主要使用C语言处理web表单。我了解MVC的模式、路由、调用操作等 但是,负责从数据库中获取数据的操作(例如通过触发存储过程)又如何呢?我看过一些教程,其中他们将直接连接到数据库的逻辑放在操作中 然而,我正在考虑一种更集中的方式来做这件事。例如,我可以将触发存储过程的所有函数放在一个名为DatabaseCoordinator.cs的单独类中,例如放在名为Helpers的文件夹中。然后我可以从控制器中的操作调用它们 这样,我就知道我可以在一个类中找到数据库的所有方

我是MVC4的新手,到目前为止,我主要使用C语言处理web表单。我了解MVC的模式、路由、调用操作等

但是,负责从数据库中获取数据的操作(例如通过触发存储过程)又如何呢?我看过一些教程,其中他们将直接连接到数据库的逻辑放在操作中

然而,我正在考虑一种更集中的方式来做这件事。例如,我可以将触发存储过程的所有函数放在一个名为DatabaseCoordinator.cs的单独类中,例如放在名为Helpers的文件夹中。然后我可以从控制器中的操作调用它们

这样,我就知道我可以在一个类中找到数据库的所有方法,我认为这是一个非常干净的解决方案,或者至少是在web表单中。然而,我希望遵循MVC模式,并且按照模式本身的名称,只使用模型、视图和控制器


那么,这方面的最佳做法是什么?我应该为此创建一个单独的类,还是直接在控制器中实现逻辑,或者在其他地方实现逻辑

您当然应该创建一个单独的存储库类来包含所有数据访问操作

这里有一个很好的例子:

您当然应该创建一个单独的存储库类来包含所有数据访问操作

这里有一个很好的例子:

控制器和视图往往位于同一个项目中,但通常会将数据访问类和模型拆分为各自独立的类库,因为这允许其他项目使用它们

这将允许您在将来添加windows窗体/wpf接口或移动设备接口,利用独立类库中已有的工作

另一个要考虑的问题是如何在MVC应用程序中使用VIEW模型。当视图需要多个域对象时,这是一种常见的技术

控制器和视图往往位于同一个项目中,但通常会将数据访问类和模型拆分为各自独立的类库,因为这允许其他项目使用它们

这将允许您在将来添加windows窗体/wpf接口或移动设备接口,利用独立类库中已有的工作


另一个要考虑的问题是如何在MVC应用程序中使用VIEW模型。当视图需要多个域对象时,这是一种常见的技术

检查工作单元模式UOW与存储库模式的组合。无论最终是调用存储过程还是内联linq查询来返回结果,调用方都不应该知道或关心GetPersons最终是如何实现的。UOW模式与Repository模式相结合是ASP.NET社区中公开实体框架数据库的一种非常流行的方式。您将找到不同的方法来实现这一点,有些方法过于简单,有些方法只是创建依赖项而没有实际好处,但您将找到一种适合这些模式的方法。

查看工作单元模式UOW与存储库模式的结合。无论最终是调用存储过程还是内联linq查询来返回结果,调用方都不应该知道或关心GetPersons最终是如何实现的。UOW模式与Repository模式相结合是ASP.NET社区中公开实体框架数据库的一种非常流行的方式。您将找到不同的方法来实现这一点,有些方法过于简单,有些方法只是创建依赖项,没有实际的好处,但您将找到一种适合这些模式的方法。

我建议您将数据访问代码放在控制器之外的其他位置。控制器的主要目的是收集信息,以便在页面上显示或在页面上显示-从发布的页面获取数据,并将其反馈给负责业务规则和数据访问的代码

对于大多数MVC项目,见鬼,对于大多数项目真的!我构建单独的类库项目——至少一个用于业务规则和数据访问,不过通常我会创建这两个单独的项目。分离逻辑的目的实际上是为了简化将来的维护和可重用性。如果您将各种逻辑部分分开,那么如果您的逻辑或数据库需要更改,您可以轻松地将它们替换掉,或者您可以轻松地使用新类型用户界面中的业务规则和数据;例如,如果您决定将项目作为web系统之外的Windows窗体应用程序来实现,理论上您可以重用业务逻辑和数据访问逻辑库,只重建用户层。然而,如果您将逻辑构建到控制器中,就不能重用t 无需提取hat逻辑并将其转换为您正在使用的新应用程序模型

所以,简单地说,一定要让99%的逻辑和数据访问远离控制器。只将您必须放入控制器的内容放入一个单独的类中,或者在适当的情况下,将其余内容放入单独的类库中


祝你好运

我建议您将数据访问代码放在控制器之外的其他位置。控制器的主要目的是收集信息,以便在页面上显示或在页面上显示-从发布的页面获取数据,并将其反馈给负责业务规则和数据访问的代码

对于大多数MVC项目,见鬼,对于大多数项目真的!我构建单独的类库项目——至少一个用于业务规则和数据访问,不过通常我会创建这两个单独的项目。分离逻辑的目的实际上是为了简化将来的维护和可重用性。如果您将各种逻辑部分分开,那么如果您的逻辑或数据库需要更改,您可以轻松地将它们替换掉,或者您可以轻松地使用新类型用户界面中的业务规则和数据;例如,如果您决定将项目作为web系统之外的Windows窗体应用程序来实现,理论上您可以重用业务逻辑和数据访问逻辑库,只重建用户层。但是,如果您将逻辑构建到控制器中,那么如果不提取逻辑并将其转换为您正在使用的新应用程序模型,就无法重用该逻辑

所以,简单地说,一定要让99%的逻辑和数据访问远离控制器。只将您必须放入控制器的内容放入一个单独的类中,或者在适当的情况下,将其余内容放入单独的类库中


祝你好运

在积累了更多经验之后,我想更改我的答案,并声明存储库模式和工作单元模式是毫无意义的抽象层,以阻止您使用实体框架,这是您的数据层抽象!直接的


除了能够从Microsoft SQL PostgreSQL中交换数据库之外,在现实世界中什么时候会发生这种情况?如果您不希望在代码中重复复杂查询的结构,我看不到存储库模式的真正价值。要在插入/更新时包含CreatedBy、ModifiedBy值,只需覆盖EntityFramework。要封装包含业务规则的查询,如where active=1和isdeleted=0,只需使用扩展方法扩展Linq查询。

更多经验后,我想更改我的答案,并声明存储库模式和工作单元模式是无意义的抽象层,以阻止您使用实体框架,这是您的数据层抽象!直接的


除了能够从Microsoft SQL PostgreSQL中交换数据库之外,在现实世界中什么时候会发生这种情况?如果您不希望在代码中重复复杂查询的结构,我看不到存储库模式的真正价值。要在插入/更新时包含CreatedBy、ModifiedBy值,只需覆盖EntityFramework。要封装包含业务规则的查询,如where active=1和isdeleted=0,只需使用扩展方法扩展Linq查询。

此答案是否仍反映您的首选项?如果是这样,您通常将数据访问类库命名为什么?谢谢这个答案是否仍然反映了你的偏好?如果是这样,您通常将数据访问类库命名为什么?谢谢