C# .Net MVC-从视图中访问数据库,而不仅仅是糟糕的做法?

C# .Net MVC-从视图中访问数据库,而不仅仅是糟糕的做法?,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我见过一些开发人员实例化从视图中访问数据库的模型。通常,当他们想要访问html部分时会执行此操作,并且他们只需在视图中创建一个新的viewmodel: <div class='blogListing'> @Html.Partial("BlogListing", new BlogListingViewModel(10)); </div> @Html.Partial(“BlogListing”,新的BlogListingViewModel(10)); 对我来说,

我见过一些开发人员实例化从视图中访问数据库的模型。通常,当他们想要访问html部分时会执行此操作,并且他们只需在视图中创建一个新的viewmodel:

<div class='blogListing'>
    @Html.Partial("BlogListing", new BlogListingViewModel(10));
</div>

@Html.Partial(“BlogListing”,新的BlogListingViewModel(10));
对我来说,最佳实践是在ViewModels中实例化所有模型,然后将它们传递给partials。在下面的示例中,BlogHomeViewModel将创建一个新的BlogListingViewModel(10),并将其设置为视图要使用的公共属性:

@Model BlogHomeViewModel

<div class='blogListing'>
    @Html.Partial("BlogListing", Model.BlogListing);
</div>
@Model BlogHomeViewModel
@Html.Partial(“BlogListing”,Model.BlogListing);

我的问题是,这不仅仅是一个糟糕的实践/维护问题吗?从视图中访问数据库是否也存在性能问题?我认为一个模型可以在几乎相同的时间触发所有数据库请求,但是在一个视图中,您已经开始呈现html,因此必须打开和关闭更多连接,从而降低页面负载。我在这里偏离了底线吗?

和往常一样,给程序员换肤的方法不止一种。那句话就是这么说的,对吧

几年前,当我第一次开始使用MVC框架时,我一直试图找出每个字母应该负责的金标准。有很多意见,但最终取决于你和你的团队,找出适合你的方法

我认为连接到视图模型中的数据库是不好的做法。有些人在模型中打开连接以获取数据。不是我。当我思考模型的责任时,它只是:

  • 最终将显示在UI中的数据
  • 正确构建UI所需的数据(例如,有条件地显示某些选项的
    bool
  • 我经常将我的模型称为“自给自足”。这意味着我的模型需要在进入视图时拥有所需的所有数据。我让我的控制器处理数据库连接、API调用、LDAP查询等。显然,我的控制器并不包含这些方法的所有代码(我有适当的专门库来处理不同的需求),但它是不同数据源之间的代理

    以这种方式构建应用程序的好处在于,当繁重的工作完成时,您可以确定。您知道,当您调用
    返回视图(模型)
    时,您已经获得了所需的所有数据。您不必对模型或视图中的错误查询(或缓慢的API调用等)进行故障排除。画出每一部分负责什么的界线,是框架对我有用的原因


    记住,这些是我对如何使用框架的看法。我不是说这是唯一的解决办法。您的开发团队可能会发现一些更有用的东西,但是,保持这一原则对我来说已经有好几年了。

    我认为从您的角度调用DB不会有任何性能问题。无论如何,在它进入浏览器之前,它都会在IIS中得到处理。唯一的例外是,如果您多次打开/关闭连接

    通常,保持关注点分离的主要原因是,M V C的每个部分都有一个特定的职责,而您不必到处寻找这些数据的来源


    另外,从单元测试的角度来看,您希望将数据访问保持在一个可以测试的地方,而视图并不是一个很好的地方。

    不从视图访问数据库的不成文规则实际上与编写良好的可维护代码无关。开发人员总是在为做某事寻找一些具体的验证:它更具性能,等等。有时候,你只是做一些事情,因为它不会让你后面的开发人员,嗯,想要追你。。。用屠刀


    MVC(通常的范例)的全部目的是分离关注点和适当的代码模块化。如果您的视图需要知道如何访问数据库,那么您已经打破了单一责任原则,将代码束缚在了一起,如果数据库访问发生变化,您也需要更改视图。这并不完全是常识,因此任何不熟悉代码库的开发人员都可以(墨菲说肯定会)在不知道它们影响了视图的情况下改变视图中影响代码的某些内容,这样您的应用程序就会付之一炬。

    Nice-一个合理、编写良好、深思熟虑的答案。对于最初的几个MVC项目,我低估了维护ViewModel规程的价值(以下是显示视图所需的一切)。这种简单性很有价值。因此,您的模型只是一个没有处理的DTO,而您将DTO填充到控制器本身?我想问的更多的是性能方面的考虑,而不是最佳实践。我认为这是可以具体回答的。撇开最佳实践意见不谈,从一个视图中创建多个数据库访问模型是否会影响性能?@JPBerry-从性能角度看,在何处执行查询并不重要。如果在控制器和模型中执行相同的查询,它仍然是一个查询,对于数据库来说看起来完全相同。如果您使用的是类似于ORM的实体框架,那么如果您使用了诸如延迟加载之类的“功能”,您必须始终小心。@Scottie-是和否。我有DTO,可以从其他库传递到控制器(如我常用的第三方API包装器)。使用这样一个例子,我可以将对象列表(例如,
    list
    )放入我的模型中。我不让我的模型建立任何连接来获取数据;这是一条单行道。