统一MVC和Web API控制器

时间:2015-08-19 10:39:41

标签: asp.net asp.net-mvc asp.net-web-api asp.net-core-mvc

我正在使用ASP.NET MVC6构建一个Web应用程序,需要通过Web浏览器(通过视图)以及通过Web API从移动应用程序访问。问题是我想避免在控制器中复制业务逻辑。

我知道MVC6控制器返回IActionResult。当用作MVC控制器时,IActionResult可能是一个视图。当用作Web API控制器时,IActionResult可能是数据(例如产品列表)。同一个控制器可能具有返回视图和数据的操作(两个不同的操作)。

但我的要求是有一个单一的方法,当以网站形式正常方式调用时可用于呈现视图,并在调用Web API方法时返回数据。

1 个答案:

答案 0 :(得分:0)

正如您已经知道的那样,MVC控制器和Web API控制器现在完全相同。它们已经在MVC 6.0中统一了。

当你说你想避免在控制器中出现重复的业务逻辑时,我想问一下为什么它首先是这样的?

您是否有/您不应该使用某种类库项目作为您的业务层,您可以在其中存储所有相关的业务规则?

例如:

  • Contoso.Web(MVC 6.0应用程序)
  • Contoso.Service(包含业务规则的类库)
  • Contoso.Data(包含DataContext和Entity的类库 框架内容......)
  • Contoso.Core或Contoso.Domain(包含您域名的类库 类/波苏斯)

此外,您希望能够在经典浏览器中和移动设备一起查看应用程序。你有没有考虑建立一个SPA (Single Page Application),让你在这两个方面都做得最好?

SPA方法允许您创建视图并使用客户端框架(例如:Angular)将允许您调用WebAPI,而WebAPI又会调用您的Contoso.Service图层。

当然,除非您的移动应用是本机的,只需要调用您的WebAPI

如果IActionResult有一种方法可以返回View或某些Data,那么我担心的是IActionResult可能会开始增长并拥有一些Views其中可发现的逻辑,从长远来看可能难以维护/调试。

当您修改其行为时,也会增加回归的可能性,因为您需要同时测试mobile apphostname =~ /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/

我对你的项目知之甚少,我会看一下SPA方法,看它是否符合你的需要。