[英]RESTful and Repository returning values from another type architecture
简而言之,我有两个数据库表:语言和框架。 重要的是,表之间存在一对多关系(一种语言有很多框架)。 我正在设计一个RESTful(WebAPI2)服务来使用这些表中的信息。 我正在使用存储库模式。 使用EF,我为该语言建立了导航属性,以达到其框架。
但是,应该如何在存储库中实现它。 在语言存储库中返回框架集合是否正确? 我想使用相同的WebAPI控制器来访问一种语言的框架,因为它提供了更简单的路由,而且我不确定这是否是正确的方法。
public class LanguagesController : ApiController
{
private readonly IProgrammingLanguageRepository languages;
public LanguagesController() : this(new ProgrammingLanguageRepository(new CVSystemDbContext()))
{
}
public LanguagesController(ProgrammingLanguageRepository languagesRepository)
{
this.languages = languagesRepository;
}
[HttpGet]
[Route("api/languages")]
public IHttpActionResult GetAll()
{
return this.Ok(this.languages.GetAll());
}
[HttpGet]
[Route("api/languages/{id:int}")]
public IHttpActionResult GetById(int id)
{
return this.Ok(this.languages.GetById(id));
}
[HttpGet]
[Route("api/languages/{id:int}/frameworks")]
public IHttpActionResult GetByLanguage(int id)
{
----
}
}
另一方面,如果我在框架存储库中实现它(通过使用上下文中其他表中的navigation属性或通过id扫描),则应在框架WebAPI控制器中使用一些讨厌的路由(例如“ api” / frameworks / bylanguage / {id}“),这似乎也不正确。
我认为,要使RESTful服务尽可能整洁,这是在业务实体的基础上定义api控制器的最佳方法。 也就是说,您应该定义一个控制器来分别对languages
和frameworks
执行CRUD操作,如下所示:
public class LanguagesController : ApiController
{
public IHttpActionResult Get(int id)
{
// logic to query and return a language by id
}
public IHttpActionResult GetAll()
{
// logic to query all (and possibly paginate) all the languages
}
}
public class FrameworksController : ApiController
{
public IHttpActionResult Get(int id)
{
// logic to query and return a framework by id
}
public IHttpActionResult GetByLanguage(int id)
{
// logic to return the frameworks of a specific language
}
public IHttpActionResult GetAll()
{
// logic to query all (and possibly paginate) all the frameworks
}
}
我的意思是,对于RESTful服务,最好不要假设它们如何消耗返回的数据。 也就是说,您不应该假设在所有显示语言的地方都同时显示了框架。 例如,假设某些客户以表格形式列出了语言。 在其中包含框架的情况下,UI也将变得非常凌乱。 最好让用户选择一种语言并分别显示详细信息,例如在模式窗口中。 毕竟,RESTful服务的重点是尽可能细化地提供数据,而不是根据您的特定视图进行调整。 它们旨在将数据提供给各种支持HTTP的设备和软件-包括浏览器和智能手机应用程序。 如果您只想使用AJAX调用提供一些适合您的视图的数据,最好在常规MVC控制器上定义响应ajax调用并返回JsonResult
操作方法。
我还要在这里指出的一件事是,您不应在服务中返回数据库实体。 我会提到两个+一个原因:
简而言之,要解决此问题,您应该定义一些类,这些类准确地描述了将哪些数据发送回客户端,并仔细实现了如何选择它们的逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.