我有近10个控制器,它们目前共享相同的代码。代码非常简单,只是检查一组数据是否为空,并检查当前用户是否有权访问数据。
如果出现问题,我会抛出一个HttpResponseException。
代码在每个控制器中都有效。我也设法集中代码,但我认为我做的方式是错误的。我创建了一个继承ApiController的新类,然后让控制器继承我的新类。这是我可以使HttpResponseExceptions正常工作的唯一方法。代码如下:
//New centralized class:
public class AuthorizationClass : ApiController
{
private DataModel db = new DataModel();
public async Task checkUserisValid(int user_id)
{
user_list user_list = await db.user_list.FindAsync(user_id);
if (user_list == null)
{
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest,"This user does not exist"));
}
int businessID = user_list.business_id;
var result = checkAccess(User.Identity.Name, businessID);
if (result.Count <= 0)
{
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "You do not have access to modify this business"));
}
}
public static List<user_details> checkAccess(string userName, int id)
{
//code which checks if the user is in the right tables
return checkAccess.ToList();
}
}
然后在控制器类中,我有:
public class MyController : AuthorizationClass
{
public async Task<IHttpActionResult> Postnew_table(int id, new_table new_table)
{
await checkUserisValid(id);
//rest of controller
}
}
我尝试以不同的方式做到这一点,但这是我可以使用HttpResponseException的唯一方法。有没有更好的方法来做这个而不继承类,或者这是我做的事情的唯一方法吗?
感谢。
答案 0 :(得分:1)
你可以将这两个方法移动到一个公共程序集中的某个静态帮助器类,你提到Request
是控制器上的一个实例变量,只需将它传递给方法。
public static class SomeHelper
{
public static async Task checkUserisValid(int user_id, DataModel db, Request request, User user)
{
user_list user_list = await db.user_list.FindAsync(user_id);
if (user_list == null)
{
throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.BadRequest,"This user does not exist"));
}
int businessID = user_list.business_id;
var result = checkAccess(user.Identity.Name, businessID);
if (result.Count <= 0)
{
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "You do not have access to modify this business"));
}
}
public static List<user_details> checkAccess(string userName, int id)
{
//code which checks if the user is in the right tables
return checkAccess.ToList();
}
}