Asp.net mvc 4 如何在单个Web应用程序中最好地结合Web Api和MVC

Asp.net mvc 4 如何在单个Web应用程序中最好地结合Web Api和MVC,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我即将创建一个简单的web应用程序,我想知道是否应该使用ASP.NET MVC 4新功能web API 最好的方法是什么 我做了一些研究,发现有两种选择: 选项1 使Web Api成为我的服务层,并从控制器调用它来读/写数据,并使用视图模型和razor呈现视图 选项2 将Web Api设置为我的服务层,并使用Javascript从视图中直接调用它 我不太喜欢选项2,因为我觉得我忽略了只用于页面之间重定向的控制器。此外,我更喜欢使用razor而不是Javascript 如果我选择选项1,我是否必须

我即将创建一个简单的web应用程序,我想知道是否应该使用ASP.NET MVC 4新功能
web API

最好的方法是什么

我做了一些研究,发现有两种选择:

选项1

使Web Api成为我的服务层,并从控制器调用它来读/写数据,并使用视图模型和razor呈现视图

选项2

将Web Api设置为我的服务层,并使用Javascript从视图中直接调用它

我不太喜欢
选项2
,因为我觉得我忽略了只用于页面之间重定向的控制器。此外,我更喜欢使用razor而不是Javascript

如果我选择
选项1
,我是否必须在控制器中创建一个Web API实例?因为这让我觉得我做错了什么

最好的选择是什么?还有其他我没有考虑的选择吗

如果你能给我一些能帮助我的参考资料或书籍,我将不胜感激


谢谢。

对于我的业务规则,我通常有另一层(根据应用程序的大小和复杂性,可以是不同的项目/程序集)。您可以将其称为业务服务,或任何适用于您的案例的服务

因此MVC控制器和API控制器都使用这个层;这样可以保持应用程序干燥

我个人更喜欢在我的业务层中只保留复杂的操作,这意味着如果我需要从持久化层读取一些内容以显示在视图中,我可以直接在MVC控制器上执行。这是个人偏好的问题,但我更喜欢走CQR的方式

因此,MVC控制器将实例化这些业务服务(或者,如果使用IoC,它们将被注入控制器)。对于读取操作,您可以选择直接进入持久层或使用其他读取策略

同样的情况也会发生在API控制器上,它们将使用这个“公共”服务层

您不需要在MVC控制器上实例化API控制器。 如果您正在开发SPA或类似产品,则可以通过AJAX使用Web Api控制器

构建应用程序没有单一的方法,只有不同的方法,每一种方法或多或少都会带来痛苦

如果您正在考虑在应用程序中引入测试(您应该:);然后,您应该以一种易于测试每个部分的方式来构造它


只要我的2美分。

Web API的全部意义在于成为一个无状态RESTful服务。如果你做得对,就永远不会有这样的例子。我知道这个问题很老了,你可能自己也学过,但答案对你来说并不像对一个常见问题的回答那样重要

请注意,在谈到WebAPI时,人们通常谈论的是APIController,而不是采用路由并将其转换为视图的基本MVC“控制器”

因此,在您的项目中,您可能有一些“控制器”,它们执行一些基本的视图逻辑,但没有业务逻辑。不要将其与服务层混淆,服务层是业务逻辑和持久性访问的包装器

一、 许多人认为,Apicontroller不应该与MVC应用程序混合使用。请记住,MVC不能很好地与Web API混合。正如菲利普W所说:

WebAPI和MVC使用的许多概念,尽管在 乍一看,它们实际上并不兼容。例如,WebAPI 属性为System.Web.Http.Filters.Filter,MVC属性为 System.Web.Mvc.Filter-它们不可互换

最灵活的答案

因此,您要做的是创建一个名为api.YourWebsite.com的子域,并在那里构建一个新的Web api ApicController项目。该WebAPI项目只需通过ApicController和依赖项注入实例化和公开业务逻辑

备选方案1

面向服务的体系结构都是关于可重用性的。如果你想让你的应用程序保持干爽,你肯定应该加入SOA。然而,每种情况都是不同的。如果您永远不会在本网站的任何其他应用程序(台式机、android、平板电脑、ewPhones等)中使用相同的业务逻辑,那么您可以选择另一种方法

将业务逻辑层创建为不同的项目,并直接从web应用程序访问它。当您的Javascript(Angular/Razor?)控制器进行调用时,它们可以调用您的ViewModels和/或Codebehind或类似的东西,这些东西可以实例化业务逻辑并直接访问它。如果一切正常且不会重复使用,则不需要服务

备选方案2

继续,将您的Web API APIController放在同一个项目中。但是,请确保将它们与MVC“控制器”分离到不同的文件夹中。尽管如此,当Javascript控制器发出调用时,它们仍会向您的网站发送无状态返回的路由调用。不要将无状态APIController与ViewModels和其他MVC代码混合使用

缺点是缺乏SOC。现在您已经混合了服务层和UI层,并且您的UI层被强制访问您的业务逻辑层(DLL)。如果备选方案1做到了,那又有什么错呢


好吧,问题是备选方案1是一个没有增长空间的小应用程序。其他任何东西(最初的计划,或者这里的备选方案2)都应该有一个UI,它根本不知道业务逻辑(或者持久性)是否存在。他们应该在不知道后端世界的情况下进行他们的末日之旅。

我会选择最简单的选项,选项2似乎是两个选项中比较简单的一个。谢谢Raciel,我想是这样的