簡體   English   中英

MVC API優化:將ihhtpresult從自定義類返回給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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM