跨不同方法共享同一对象并在 C# web 中进行相应更新 API

Sharing same object across different methods and update accordingly in C# web API

为我糟糕的英语和可能是一个愚蠢的问题道歉。我是 C# web 的初学者 api.

我想做的只是在 c# 中进行一些数据操作并从 Web API 响应前端 (Angular)。

这是我的标记方式

控制器

[HttpGet]
public async Task<ProjectResult> Get(ProjectDetails d)
{
   return Ok(_myclass.ProcessData(d));
}

Class 定义

public class ProjectDetails{
   public int pId{get;set;}
   public string pName{get;set;}
}

public class ProjectResult{
  public datetime startedAt(get;set;)
  public int TotalProcessed(get;set;)
  public string remark(get;set;)
  public int TotalRowsAdded(get;set;)
}

public class myClass{
   readonly projectdetails d;
   public myClass(){
     d = new projectdetails();
   }

  public async Task<ProjectResult> ProcessData(ProjectDetails d){
     d.startedAt=now();
  }

  private void method1(){
    d.TotalProcessed=10;
    //some code
  }

  private void method2(){
    d.TotalRowsAdded=100;
    //some code
  }

  private void method3(){
    //some code
    d.remark="method 3 finished";
  }
}

所以我认为你满足了我的要求。我需要 return ProjectResult 数据到前端 SPA。并且需要在每个方法中更新项目结果对象。

那么这是正确的方法吗?请帮我解决这个问题

根据 WebAPI 标准,HTTPGET 不接受任何请求负载。所以,

  • 要么将您的控制器操作更改为 HTTPPOST,以便您可以从 Angular 客户端发送请求负载。 [HttpPost] [Route("api/projects")] public IHttpActionResult GetProjectResult(ProjectDetails d) { return Ok(_myclass.ProcessData(d)); }
  • 或修改您的 HTTPGET 以通过路由接受(请参阅属性路由了解如何执行此操作),如下所示: [HttpGet] [Route("api/projects/{pId}/results/{pName}")] public IHttpActionResult GetProjectResult(int pId, string pName) { return Ok(_myclass.ProcessData(new ProjectDetails{ pId = pId, pName = pName })); } 然后你像这样调用它:/api/projects/100/results/testproject.

话虽如此,因为您正在将 ProjectDetails 从 WebAPI 控制器传递到您的 ProcessData 方法,所以您不需要在 MyClass 中实例化。 由于问题中您的意图不是很清楚。因此,我假设您想在修改一些数据后 return ProjectResult。如果这是您的意图,则创建一个 ProjectResult 对象,如下所示,并在所有 MyClass 方法中使用该对象。由于 类 是“引用类型”,无论您对对象进行何种更改,它们都会出现在每个方法中。

public class myClass
{
    /*readonly projectdetails d;*/
    readonly ProjectResult r;

    public myClass()
    {
        r = new ProjectResult();
    }

    public async Task<ProjectResult> ProcessData(ProjectDetails d)
    {
        r.startedAt = DateTime.Now;
        method1();
        method2();
        method3();
        return r;
    }

    private void method1()
    {
        r.TotalProcessed = 10;
        //some code
    }

    private void method2()
    {
        r.TotalRowsAdded = 100;
        //some code
    }

    private void method3()
    {
        //some code
        r.remark = "method 3 finished";
    }
}

这是您在控制器中访问的方式:

[HttpGet]
[Route("api/projects/{pId}/results/{pName}")]
public async Task<IHttpActionResult> Get(int pId, string pName)
{
    /*
    // If you want to access ProjectResult, access ProjectResult like below:
    ProjectResult projectResult = await myClassObj.ProcessData(new ProjectDetails{ pId = pId, pName = pName });
    // get or set values on ProjectResult like below
    var totalProcessedRows = projectResult.TotalProcessed;
    // Return the result.
    return this.Ok(projectResult);
    */

    // If you DON'T want to access ProjectResult, just return like below
    return Ok(_myClassObj.ProcessData(new ProjectDetails { pId = pId, pName = pName }));
}