![](/img/trans.png)
[英]How to return status code if action return type is custom class in API?
[英]mvc Api optimization: return ihhtpresult from a custom class to api action
我正在使用C#,MVC和ASP.Net Web API,我意識到我的API控制器中有重復的代碼。
public IHttpActionResult PutSomething( string ParameterId)
{
var MyObject= _dbContext.objeto.Where(c => c.myId== ParameterId);
var MyDto= MyObject.FirstOrDefault();
MyDto.Visible = false;
_dbContext.SaveChanges();
return Ok();
}
從一個動作變為另一個動作的唯一一件事就是這部分
MyDto.Visible = false;
至
MyDto.Visible = true;
所以我的想法是添加一個自定義類: Class1
public class Class1
{
public xxxx MyReuseMethod(bool istrueorfalse)
{
var MyObject= _dbContext.objeto.Where(c => c.myId== ParameterId);
/*do some validations, if do not pass*/ return badrequest();
var MyDto= MyObject.FirstOrDefault();
MyDto.Visible = istrueorfalse;
_dbContext.SaveChanges();
return Ok();
}
}
並在我的api操作中調用它:
var Reuse=new class1();
class1.MyReuseMethod(true);
你能告訴我,我應該給MyReuseMethod
什么樣的回報,這樣我就可以返回Ok()
, BadRequest()
, NotFound()
等等。
讓它返回可以在控制器中使用的標志。
public interface IDtoService {
bool? MyReuseMethod(string ParameterId, bool istrueorfalse);
}
public class MyDtoServie : IDtoService {
private MyDbContext dbContext;
public MyDtoServie(MyDbContext dbContext) {
this.dbContext = dbContext;
}
public bool? MyReuseMethod(string ParameterId, bool istrueorfalse) {
var MyObject = dbContext.objeto.Where(c => c.myId == ParameterId);
var MyDto = MyObject.FirstOrDefault();
if(MDto == null) return null;
if(!/*do some validations, if do not pass*/ ) {
return false;
}
MyDto.Visible = istrueorfalse;
return dbContext.SaveChanges() > 0;
}
}
然后在控制器中根據返回的標志返回必要的結果。
public class MyApiController : ApiController {
private readonly IDtoService dtoService;
public MyApiController (IDtoService dtoService) {
this.dtoService = dtoService;
}
public IHttpActionResult PutSomething(string ParameterId) {
var result = dtoService.MyReuseMethod(ParameterId, false);
if(result == null) return NotFound();
if(result == false) return BadRequest();
return Ok();
}
}
重構代碼時,請盡量避免混淆。
Ok()
, BadRequest()
, NotFound()
等...是控制器的關注點,應保留在控制器中。
您可以擴展抽象的基本ApiController
,它將提供Ok()
, BadRequest()
等的實現。
public abstract class MyBaseApiController : ApiController
{
public virtual IHttpActionResult MyReuseMethod(bool isTrueOrFalse)
{
return Ok();
}
}
我將查詢代碼分開,只讓控制器處理Dto模型。
public abstract class MyBaseApiController : ApiController
{
public virtual IHttpActionResult MyReuseMethod(MyDto model)
{
return Ok();
}
}
public class MyApiController : MyBaseApiController
{
IMyService service;
public MyApiController()
{
service = new MyService();
}
public IHttpActionResult Get(int id)
{
var dto = service.GetItem(id);
return MyReuseMethod(dto);
}
}
Ok()
, BadRequest()
等方法是Controller
基類上可用的方法。 我不建議您在可重用的類中使用它們,因為這會將您的代碼緊密耦合到MVC的特定實現上。 相反,您可以使您的方法成為void
方法,並在調用新類方法的下方從控制器方法返回Ok()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.