【问题标题】:MVC website calling WCF is better or MVC calling database operation directly is betterMVC网站调用WCF更好还是MVC直接调用数据库操作更好
【发布时间】:2013-04-22 13:13:34
【问题描述】:

我们需要开发一个可以从桌面浏览器浏览的网站。我们还需要为同一个网站开发一个安卓应用程序。我们正在考虑使用 ASP.NET MVC,使用 C#、Microsoft SQL Server 和 Windows Communication Foundation、Linq To Entity with Repository Framework。

WCF 将使用 Linq to Entity 使用 Repository Framework 访问数据库并返回 JSON。

问题 1 Android 应用程序将调用 WCF 服务。我们的想法正确吗?

问题 2 ASP.NET MVC 网站会调用 WCF 服务。让 ASP.NET MVC 应用程序调用 WCF 服务更好还是让 ASP.NET 应用程序直接与数据库通信,中间没有 WCF 更好?

我的想法是仅将 WCF 用于 android 应用程序,并使 ASP.NET MVC 使用 linq 到实体框架直接与数据库交互,使用存储库模式,中间没有 WCF。这会是一个好方法吗?

问题 3 如果 ASP.NET MVC 网站会调用 WCF 服务,我需要在哪里实现 DI。我认为它必须在存储库框架和 WCF 服务之间,DI 在 ASP.NET MVC 和 WCF 之间没有任何关系。对吧?

这可能是一个简单的问题,但我想知道如果其他人有同样的要求,他们会怎么做。像网站和安卓应用程序。我不熟悉 DI 以及如何使用它。我一直在阅读有关 DI 的信息,但不太了解。所以我想知道 DI 将存在于哪里?

【问题讨论】:

  • 通常 Android 只是调用一个以 JSON 格式回复的网络服务。只要 Web 服务可以返回 JSON 格式(根据 wikipedia WCF 在 .net 3.5 上有它),您就可以使用您喜欢的任何结构进行编程。

标签: android asp.net-mvc wcf dependency-injection


【解决方案1】:
  1. 您的 Android 应用程序无法直接调用您的数据库,因此您需要一个介于两者之间的服务。这可以是 WCF 或另一个流行的选项是 ASP.NET Web API。
  2. 您不应让您的 MVC 应用程序通过 WCF 服务间接与数据库通信,除非确实需要这样做(例如出于安全或组织问题),因为这种额外的间接层会降低性能。与 WCF 进行通信有很多开销,但似乎并不一定。
  3. 如果您决定让 MVC 应用程序调用 WCF 服务,则 MVC 和 WCF 应用程序都会获得自己的 Composition Root。这意味着它们每个都有自己的 DI 配置和注入依赖项的方式。他们可能会分享很多东西,但不一定是这样。

我希望您可能会发现我的回答令人不安。您可能担心同时拥有与数据库通信的 WCF 服务和 MVC 应用程序的开发开销,而不是只有与数据库通信的 WCF 服务。

但这并不一定是这样。事实上,这不应该是这样的。当你这样做时,你做错了。 WCF 服务本身应该只是业务层之上的一个非常薄的层。您的 MVC 应用程序使用的同一业务层。事实上,当应用正确的抽象时,您可以在几分钟内将您的 MVC 应用程序从使用数据库切换到使用 WCF 服务。

您可以通过将业务操作置于通用抽象之后并使用基于消息的架构来做到这一点。在这种情况下,您的 WCF 服务(或 Web API)可以简单地排除这些消息并将它们转发到业务层。如果你这样做正确,你会发现你可以编写你的 WCF 服务或 Web API 服务,使它们变得免维护,这意味着:你不必在系统增长时更改它们;当新的业务操作被添加到系统中时。

我建议您阅读以下文章:

如果您 - 在阅读了这些文章之后 - 对如何实现此功能有疑问,请查看 Highly Maintainable Web Services project。这是一个参考架构应用程序,展示了如何使用 WCF 和 Web API 应用这些概念。

【讨论】:

  • 第二点:“出于安全考虑” 你能举一些例子吗?这是否意味着如果没有额外的 Web 服务层,应用程序的安全性会降低?
  • @Rookian:如果该数据库由另一个团队维护,则该团队不应让您直接访问其数据库。这迫使他们的数据模型紧密耦合。在这种情况下,它更像是一种组织约束。如果该数据库不在您组织的域内,而是位于全国某个地方,则您可能不应该将该数据库直接暴露给 Internet。这是一个安全问题。在这些情况下,您最好将该数据库隐藏在 Web 服务抽象后面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
相关资源
最近更新 更多