执行CRUD操作时分层

时间:2017-06-08 18:30:22

标签: c# .net json visual-studio odata

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

我有一个控制器,专门为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
}

并且AccountService.GetAccount代码如下:

public class AccountService
{
        public async Task<Account> GetAccount(string query)
        {
            var task = await Client.HTTPCLIENT.GetAsync(Client.HTTPCLIENT.BaseAddress + query);
            var jsonString = await task.Content.ReadAsStringAsync();
            var value = JsonConvert.DeserializeObject<RootObject>(jsonString);
            return value.value.FirstOrDefault();
        }
//morestuff
}

如您所见,反序列化是在AccountService处理的,而不是AccountsController

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

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中的基础Create方法:

    public async Task<HttpResponseMessage> Create(JObject account)
    {
        var request = new HttpRequestMessage(HttpMethod.Post, Client.HTTPCLIENT.BaseAddress + "accounts")
        {
            Content = new StringContent(account.ToString(), Encoding.UTF8, "application/json")
        };

        var response = await Client.HTTPCLIENT.SendAsync(request);
        var uri = new Uri(response.Headers.GetValues("OData-EntityId").FirstOrDefault());
        return await Client.HTTPCLIENT.GetAsync(uri);
    }

您将看到实际上反序列化发生在 controller 级别。

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

0 个答案:

没有答案