简而言之,我有两个数据库表:语言和框架。重要的是表之间存在一对多的关系(一种语言有很多框架)。我正在设计一个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)
{
----
}
}
另一方面,如果我在框架存储库中实现它(通过使用上下文中其他表的导航属性或通过id扫描),我应该在框架WebAPI控制器中使用一些讨厌的路由(某些东西)比如“api / frameworks / bylanguage / {id}”),这似乎也不对。
答案 0 :(得分:1)
在我看来,为了使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调用来提供针对您的视图定制的一些数据,最好只定义响应ajax调用并返回JsonResult
的常规MVC控制器上的操作方法。
我还想指出的一件事是你不应该在你的服务中返回DB entites。我会提到两个+一个原因:
简而言之,要解决此问题,您应该定义完全描述要发送回客户端的数据的类,并仔细实现如何选择它们的逻辑。