我如何存储http状态代码和错误代码的映射。首先,我正在处理的状态代码和错误代码与twitter Error codes类似。
现在的问题是,对于单个http状态代码,我是否有多个错误代码(如果是twitter,错误代码3,44,215,323,324,325,407映射到http状态代码400),如何在我的代码中存储此值。我使用Dictionary<int, List<int>>
还是有其他方法可以使用?]
我将在异常中设置错误代码。异常过滤器将解析错误代码并设置适当的http状态代码,然后将API响应发送回去。
异常类
public class APIException : Exception
{
public int ErrorCode { get; set; }
public APIException(int errorCode, string message) : base(message)
{
ErrorCode = errorCode;
}
}
异常过滤器代码段
var apiException = actionExecutedContext.Exception as APIException;
int statusCode = GetHttpStatusCode(apiException.ErrorCode)
var response = new HttpResponseMessage((HttpStatusCode)(statusCode));
var apiResult = new APIResult(apiException.ErrorCode, apiException.Message);
response.Content = new ObjectContent<APIResult>(apiResult, new JsonMediaTypeFormatter(), "application/json");
actionExecutedContext.Response = response;
现在的问题是关于GetHttpStatusCode()
功能的实现。目前,我正在考虑使用Dictionary<int, List<int>>
存储映射。通过搜索值(错误代码)来获取键(httpStatusCode)。
我可以拥有一个简单的字典,其中错误代码是键,而http状态代码是值。但是,如果我必须查看特定状态码的所有错误代码,此列表将变得庞大且可读性将很困难。
坦率地说,带有平面词典的那个
[...]列表将变得庞大,如果我必须查看特定状态码的所有错误码,则可读性将很困难。
不是使代码过于复杂且性能降低的很好的借口。尽管Dictionary<int, List<int>>
的可读性可能会好一些,但是代码本身(并且应该是重要的代码)的可读性会受到影响。恕我直言,这是次优代码结构的症状。
使用平面字典,查找变得简单
int GetHttpStatus(int errorCode)
{
return errorCodeMappings[errorCode];
}
而且由于键在字典中不能多次出现,所以不可能将错误代码相乘。
[ 。)如果将其包装在某些Dictionary<int, List<int>>
类中,则可以将构造函数定义为
StatusCodeMapper
并且将public ErrorCodeMapper(Dictionary<int, List<int>> reverseMappings) { // Convert mappings to a more efficient format this.mappings = reverseMappings.SelectMany(entry => entry.Value.Select(errorCode => new { errorCode, status=entry.Key})) .ToDictionary(mapping => mapping.errorCode, mapping => mapping.status) }
保留在最高级别,但是如果打算使用的话,请利用更简洁,更快速的查找和自动检查使用Dictionary<int, List<int>>
所获得的重复错误代码。如果仅创建Dictionary
的单个实例,则“昂贵”的代码(虽然,虽然不太昂贵,但比哈希查找要多)仅运行一次。