【问题标题】:How to build server url for DTOs如何为 DTO 构建服务器 url
【发布时间】:2020-03-21 07:29:12
【问题描述】:
我想为我的 DTO 添加一个 url,特别是集合中每个对象的规范链接。我正在使用 Dapper 将我的 SQL 结果映射到一个集合中,所以我希望在 POCO 本身内执行此操作。
public class Group {
public string Name { get; set; }
public string url {
get {
//CODE TO BUILD LINK HERE (e.g., https://example.com/v1/groups/1234)
}
}
}
我已经看到了 Url.Link() 的使用,但我只能在我的控制器中使用它 - 而不是我上面的 url 属性。如果不能在 POCO 中完成,是否有一种首选方法可以在 Dapper 加载后更新我的 Group 对象集合?
【问题讨论】:
标签:
c#
asp.net-core
asp.net-core-webapi
asp.net-core-routing
【解决方案1】:
dapper/service 加载记录后,您将需要遍历集合并根据记录的标识符和路由生成 URL
假设
public class Group {
public string Name { get; set; }
public string Url { get; set; }
}
生成记录 URL 的控制器可以遵循以下模式
[Route("v1/groups")]
public class GroupsController : Controller {
//...omitted for brevity
//GET v1/groups
[HttpGet("")]
public IActionResult Get() {
IEnumerable<Group> groups = service.GetGroups()
.Select(group => {
var url = Url.RouteUrl("GetGroup", new { name = group.Name });
group.Url = url;
return group;
}).ToList();
if(!groups.Any()) return NotFound();
return Ok(groups);
}
//GET v1/groups/1234
[HttpGet("{name}", Name = "GetGroup")]
public IActionResult Get(string name) {
var group = service.GetGroup(name);
if(group == null) return NotFound();
group.Url = Url.RouteUrl("GetGroup", new { name = group.Name });
return Ok(group);
}
}