调用WCF的MVC网站更好或者MVC调用数据库操作直接更好

ncc*_*071 3 asp.net-mvc wcf android dependency-injection

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

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

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

问题2 ASP.NET MVC网站将调用WCF服务.使ASP.NET MVC应用程序调用WCF服务更好或者ASP.NET应用程序直接与数据库通信而不在中间使用WCF更好?

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

问题3 如果ASP.NET MVC网站将调用WCF服务,我在哪里需要实现DI.我认为它必须在存储库框架和WCF服务之间,并且DI将在ASP.NET MVC和WCF之间无关.对?

这可能是一个简单的问题,但我想知道其他人如果有相同的要求,他们是如何做的.喜欢网站和Android应用程序.我不熟悉DI以及如何使用它.我一直在阅读关于DI的内容并没有得到它.所以我想知道DI会存在哪里?

Ste*_*ven 6

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

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

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

您可以通过将业务操作置于通用抽象之后并使用基于消息的体系结构来实现此目的.在这种情况下,您的WCF服务(或Web API)可以简单地排除这些消息并将它们转发到业务层.如果您正确地执行此操作,您将发现您可以以免维护的方式编写WCF服务或Web API服务,这意味着:您不必在系统增长时更改它们; 何时将新业务操作添加到系统中.

我建议你阅读以下文章:

如果您在阅读这些文章之后 - 对如何实现这一点存在疑问,请查看Highly Maintainable Web Services项目.这是一个参考体系结构应用程序,它显示了如何使用WCF和Web API应用这些概念.