Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 执行积垢操作时的层分离_C#_.net_Json_Visual Studio_Odata - Fatal编程技术网

C# 执行积垢操作时的层分离

C# 执行积垢操作时的层分离,c#,.net,json,visual-studio,odata,C#,.net,Json,Visual Studio,Odata,我对我的反序列化逻辑应该去哪里感到困惑 我有一个控制器,专门为GET操作将数据返回到客户端: public accountscontroller:apicontroller { [HttpGet] [Route("", Name = "GetAccount")] public async Task<IHttpActionResult> GetAccount() { var query = Requ

我对我的反序列化逻辑应该去哪里感到困惑

我有一个控制器,专门为GET操作将数据返回到客户端:

public accountscontroller:apicontroller
{
        [HttpGet]
        [Route("", Name = "GetAccount")]
        public async Task<IHttpActionResult> GetAccount()
        {
            var query = Request.RequestUri.PathAndQuery.Split('/')[2];
            var response = await _accountService.GetAccount(query);

            if (response == null)
            {
                return NotFound();
            }

            return Ok(response);
        }
//morestuff
}
public class AccountController
{
        [HttpPost]
        [Route("", Name = "CreateAccount")]
        public async Task<IHttpActionResult> CreateAccount([FromBody] JObject account)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var response = await _accountService.Create(account);

            var newAccount = await response.Content.ReadAsAsync<object>();

            return Ok(newAccount);
}
如您所见,反序列化是在
AccountService
中处理的,而不是
AccountsController

但是,如果我们查看后期操作:

public accountscontroller:apicontroller
{
        [HttpGet]
        [Route("", Name = "GetAccount")]
        public async Task<IHttpActionResult> GetAccount()
        {
            var query = Request.RequestUri.PathAndQuery.Split('/')[2];
            var response = await _accountService.GetAccount(query);

            if (response == null)
            {
                return NotFound();
            }

            return Ok(response);
        }
//morestuff
}
public class AccountController
{
        [HttpPost]
        [Route("", Name = "CreateAccount")]
        public async Task<IHttpActionResult> CreateAccount([FromBody] JObject account)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var response = await _accountService.Create(account);

            var newAccount = await response.Content.ReadAsAsync<object>();

            return Ok(newAccount);
}
您将看到,事实上,反序列化发生在控制器级别


如何封装CRUD操作的反序列化逻辑,如GET/PUT/POST以实现一致性?

您可以将其抽象到可注入服务后面。第二个代码段使用http内容的扩展方法,该方法在后台也使用Json.Net。你的担忧混杂在一起。如果你直接访问数据,你就不必对数据进行反序列化,对吗?但是,由于您正在访问第二个api并接收json,而且您似乎只需要部分信息“return value.value.FirstOrDefault();”,因此我认为将该逻辑隐藏在服务中而不是留在控制器上是有意义的。您将其抽象到可注入服务之后。第二个代码段使用http内容的扩展方法,该方法在后台也使用Json.Net。你的担忧混杂在一起。如果你直接访问数据,你就不必对数据进行反序列化,对吗?但是,由于您正在访问第二个api并接收json,而且您似乎只需要部分信息“return value.value.FirstOrDefault();”,因此我认为在服务中隐藏该逻辑而不是将其留在控制器上是有意义的。