這是我對自定義 ActionResult 的實作
public class ResultData<T>
{
public string Code { get; set; }
public string Massage { get; set; }
public T Result { get; set; }
}
public class BaseApiResult<T> : JsonResult
{
public BaseApiResult() : base(null)
{
ContentType = "application/json";
}
public IActionResult Success(T result)
{
Value = new ResultData<T>
{
Code = "2000",
Massage = "Sucsess",
Result = result
};
StatusCode = 200;
return this;
}
public IActionResult Fail(T result, string code, string massage)
{
Value = new ResultData<T>
{
Code = code,
Massage = massage,
Result = result
};
StatusCode = 400;
return this;
}
public IActionResult ServerError(T result)
{
Value = new ResultData<T>
{
Code = "5000",
Massage = "Internal Server Error",
Result = result
};
StatusCode = 500;
return this;
}
}
現在這就是我們所說的
[HttpGet("GetProducts")]
public IActionResult GetProducts()
{
try
{
var res = _entityFrameworkCoreService.GetAllProducts();
if (res.Count <= 0)
{
return new BaseApiResult<string>().Fail(null, "4002", "NoRecord found");
}
return new BaseApiResult<IList<DtoProSubCat>>().Sucsees(res); ;
}
catch (Exception ex)
{
return new BaseApiResult<string>().ServerError(ex.Message);
}
}
現在我要問的是:-
1-這是 ActionResult 的錯誤實作嗎?
2-這個實作有性能問題嗎?
3-是否有任何增強可以添加到這個實作?
3-實施自定義 ActionResult 的最佳實踐是什么?
uj5u.com熱心網友回復:
上面的方法仍然可以正常作業,但我個人認為它并不好。首先,您真正需要的是回傳包裝在 ResultData 中的結果。這被認為是一種資料模型,而不是一種行為。要知道,IActionResult不僅僅是回傳資料,在Asp MVC操作模型中,它也是HTTP服務器的輸出處理程式。
我提出以下一些解決方案,我相信會更合適。
方法一:為ControllerBase創建一個基類。例如:
public class ControllerBase : Microsoft.AspNetCore.Mvc.Controller
{
protected IActionResult MyResult <T> (int statusCode, ResultData<T> result)
{
var jsonResult = Json(result);
jsonResult.StatusCode = statusCode;
return jsonResult;
}
protected IActionResult Success <T> (T result)
{
return MyResult(200, new ResultData<T>
{
Code = "2000",
Massage = "Sucsess",
Result = result
});
}
protected IActionResult Fail <T> (T result, string code, string massage)
{
return MyResult(400, new ResultData<T>
{
Code = code,
Massage = massage,
Result = result
});
}
protected IActionResult ServerError<T>(T result)
{
return MyResult(500, new ResultData<T>
{
Code = "5000",
Massage = "Internal Server Error",
Result = result
});
}
}
/** implement */
public class HomeController : ControllerBase
{
[HttpGet("GetProducts")]
public IActionResult GetProducts()
{
try
{
IList<DtoProSubCat> res = new List<DtoProSubCat>() { new DtoProSubCat() }; //
if (res.Count <= 0)
{
return Fail<string>(null, "4002", "NoRecord found");
}
return Success<IList<DtoProSubCat>>(res); ;
}
catch (Exception ex)
{
return ServerError(ex.Message);
}
}
}
一種類似的方法是為 Controller 創建一個擴展函式,或者您將創建一個包含處理資料的函式的靜態類。
方法2:為每個回應行為創建一個特定的類。例如:
public class SuccessResult <T> : JsonResult
{
public SuccessResult (T result)
: base(new ResultData<T>
{
Code = "2000",
Massage = "Sucsess",
Result = result
})
{
StatusCode = 200;
}
}
public class FailResult<T> : JsonResult
{
public FailResult(T result, string code, string massage)
: base(new ResultData<T>
{
Code = code,
Massage = massage,
Result = result
})
{
StatusCode = 400;
}
}
public class ServerErrorResult<T> : JsonResult
{
public ServerErrorResult(T result)
: base(new ResultData<T>
{
Code = "5000",
Massage = "Internal Server Error",
Result = result
})
{
StatusCode = 500;
}
}
/** implement */
public class HomeController : Controller
{
[HttpGet("GetProducts")]
public IActionResult GetProducts()
{
try
{
IList<DtoProSubCat> res = new List<DtoProSubCat>() { new DtoProSubCat() }; //
if (res.Count <= 0)
{
return new FailResult<string>(null, "4002", "NoRecord found");
}
return new SuccessResult<IList<DtoProSubCat>>(res); ;
}
catch (Exception ex)
{
return new ServerErrorResult<string>(ex.Message);
}
}
}
你上面的實作方式,讓幾行命令變得毫無意義,當然在應用程式運行程序中問題不大,但長此以往會影響擴展或維護程序。以上兩種方式幫助你保護函式的運行模型,最小化源代碼,最小化無意義的命令列。
uj5u.com熱心網友回復:
這個 V2 怎么樣,@Henry Tr?n給出了一個提示
public class BaseApiResultV2
{
private IActionResult SetResult<T>(int statusCode, ResultData<T> result)
{
JsonResult jsonResult = new(result)
{
StatusCode = statusCode,
ContentType = "application/json"
};
return jsonResult;
}
public IActionResult Success<T>(T result)
{
return SetResult(StatusCodes.Status200OK,
new ResultData<T>
{
Code = "2000",
Massage = "Sucsess",
Result = result
});
}
public IActionResult Fail<T>(T result, string code, string massage)
{
return SetResult(StatusCodes.Status400BadRequest,
new ResultData<T>
{
Code = code,
Massage = massage,
Result = result
});
}
public IActionResult ServerError<T>(T result)
{
return SetResult(StatusCodes.Status500InternalServerError,
new ResultData<T>
{
Code = "5000",
Massage = "Internal Server Error",
Result = result
});
}
private struct ResultData<T>
{
public string Code { get; set; }
public string Massage { get; set; }
public T Result { get; set; }
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474122.html
標籤:C# asp.net 核心 仿制药 asp.net-core-mvc asp.net5
