【问题标题】:Reuse ASP.NET MVC 5 code to build RESTfull Web Api重用 ASP.NET MVC 5 代码构建 RESTful Web Api
【发布时间】:2014-05-29 17:11:15
【问题描述】:

场景

网站:ASP.Net MVC 5 管理模型、控制器和视图。

Api:RESTful Web api 管理模型、控制器和返回 JSON

问题: BL 中的代码重复。我们总是在两个地方重做相同的逻辑。

我想到的方法:

  • 将 BL 从网站 MVC 中取出,并仅将其保留在 Web Api 中的单独 VS 解决方案中
  • 网站现在是 Web Api 的消费者
  • 关于内容协商,我认为有两种选择:

    1. Web Api“知道”返回哪种格式(ViewResult、JSON 或 XML)并根据请求者(网站、移动应用程序等)在 BL 中序列化/反序列化。我看到的优势是继续服用 强类型模型在网站中呈现视图的优势

    2. Web Api 总是返回 JSON 并且消费者应用程序在客户端处理结果

问题:

  1. 这种方法是一种好的做法吗?
  2. 哪个更好:Web Api 始终返回 JSON,还是“知道”要返回哪种格式的智能 Web Api?

【问题讨论】:

  • 网站应该处理 API 提供的内容 - 不要让 api 根据请求者发送不同的响应
  • 为什么 Web 应用程序要使用 Web 服务?它们不是在相同的上下文中运行吗?如果它们确实需要成为单独的应用程序,那么要么创建额外的服务供 Web 应用程序使用,要么让它使用已经存在的服务。
  • David,它们已经是两个不同的应用程序了。该网站具有返回 Viewresult 的控制器,并且渲染视图很好,因为它是强类型的。另一个应用程序是实现 RESTfull CRUD 操作(与网站中的控制器相同)的 Web Api,仅返回 JSON。所以我想重用 Web Api 但协商返回内容。
  • 斯科特,为什么不呢?我希望从网站调用的请求返回 ViewResult,而从任何其他应用程序调用的请求返回 JSON/XML。我不希望在控制器和 Web Api 中编写相同的业务逻辑。
  • 提示:使用新的 Web API 控制器,您可以使用“ACCEPT”标头控制返回的格式。 [Accept = application/json] = JSON, [Accept = application/xml] = XML, [Accept = text\html] = HTML 等...这样调用者“知道自己想要什么”,而 Web API 只是提供服务满足要求。

标签: asp.net asp.net-mvc json asp.net-web-api2


【解决方案1】:

就像@David 所说,您实际上并不需要在 MVC 控制器中使用 Web 服务。您可以将其设计为使您的 MVC 和 API 层只是您的业务层的另一个“视图”。因此,如果您从 Visual Studio 解决方案的角度考虑,您可能有一个数据层项目、一个业务层项目和 2 个前端项目 MVC 和 API。

【讨论】:

  • 这是“不要将业务逻辑放在视图和控制器中”非常重要的一种情况。如果您的所有逻辑都保存在较低级别的组件(商务层、数据层等)中,那么 Web API 将成为原始数据视图,而 MVC 控制器只是包装在友好用户中的相同数据的视图界面。
  • Sunil,你是说我可以构建一个Class Library BL而不是Web Api BL?如果我理解正确,BL负责内容协商,MVC和API都使用同一个BL?
  • BL 是一个带有业务逻辑的简单类库。假设在 BL 中有一个名为 ProductBL 的类和名为 GetProducts() 的方法,它返回 IList<Product>()。在 MVC 控制器中,您将实例化 var productBL = new ProductBL(),然后调用 var listOfProducts = productBL.GetProducts()。现在,您有 listOfProducts 可以发送到您的视图。现在,在 web api 控制器中,您将执行完全相同的操作,只需将 listOfProducts 作为 json 或调用者想要的任何内容返回给调用者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2013-10-12
  • 1970-01-01
相关资源
最近更新 更多