我有一个网络应用,有三个不同的用户角色,分别是管理员、经销商和卖家。每个卖家都连接到一个经销商。
假设我们想显示一个卖家列表,当经销商向API提出请求时。GET: apiv1memberssellers(卖家)
预期的结果是所有的卖家都连接到该经销商。控制器可以看起来像这样。
[HttpGet]
[MemberAuthorize(AllowGroup = "Admin,Reseller")]
[Route("sellers")]
public HttpResponseMessage GetSellers()
{
var member = _memberHelper.GetCurrentMember();
if (member.Role == "Reseller")
return sellersByReseller;
if (member.Role == "Admin")
return getAllSellers;
...
}
这将是可行的,但在我看来,它看起来并不漂亮,而且很难测试。
是否有其他的C# Web API方法可以用于此?类似于这样的东西将是非常整洁的。
[HttpGet]
[MemberAuthorize(AllowGroup = "Reseller")]
[Route("sellers")]
public HttpResponseMessage GetSellers()
{
getSellersByReseller;
}
[HttpGet]
[MemberAuthorize(AllowGroup = "Admin")]
[RoutePrefix("sellers")]
public HttpResponseMessage GetSellersAsAdmin()
{
getAllSellers;
}
我觉得你不可能这样拆分,主要是因为基于角色的认证并不是相互排斥的。也就是说,应该没有什么可以阻止一个用户同时拥有 "Admin "角色和 "Reseller "角色。在这种情况下,路由将如何表现?即哪个控制器动作应该被调用?
我建议你把它分成两个独立的路由,就像你已经建议的那样。
[HttpGet]
[MemberAuthorize(AllowGroup = "Reseller")]
[Route("reseller/sellers")]
public HttpResponseMessage GetSellersByReseller()
{
return getSellersByReseller;
}
[HttpGet]
[MemberAuthorize(AllowGroup = "Admin")]
[RoutePrefix("admin/sellers")]
public HttpResponseMessage GetAllSellers()
{
return getAllSellers;
}
路径的命名是否合理由你决定 最重要的是,我建议避免让一个路由返回不同的结果。是的,它们都会返回一个卖家列表,但前提是不同的,而不仅仅是由例如搜索词来定义的,这对于一条路线来说是可以接受的。现在,这两条路线显然是为了两个不同的东西audiences。