wuhuacong(伍华聪)的专栏

wuhuacong(伍华聪)的专栏

在ABP VNext框架中,HttpApi项目是我们作为Restful格式的控制器对象的封装项目,但往往很多案例都是简单的继承基类控制器AbpControllerBase,而需要在每个控制器里面重写很多类似的Create/Update/Delete/Get/GetList等常规Restful接口的调用,千篇一律的重复,本篇随笔介绍如何对这些内容通过基类的方式实现,子类无需重复代码,并且强类型所有的接口实现。

1、Restful接口的CRUD实现

在我们使用HttpApi项目进一步封装ABP VNext框架的Application项目中的应用服务,作为Restful格式的控制器对象,往往都需要实现基本的Create/Update/Delete/Get/GetList等常规Restful接口的实现调用,官方很多案例也都是把这部分代码进行重复在重复,如下所示。

例如对于客户对象Customer的HttpApi项目控制器的代码如下:

    /// <summary>
    /// 客户信息控制器
    /// </summary>
    //[Area("crm")]
    [RemoteService]
    [ControllerName("Customer")]
    [Route("api/customer")]
    public class CustomerController : AbpControllerBase, ICustomerAppService
    {
        private readonly ICustomerAppService _customerAppService;

        public CustomerController(ICustomerAppService customerAppService)
        {
            _customerAppService = customerAppService;
        }

        /// <summary>
        /// 创建对象
        /// </summary>
        [HttpPost]
        public Task<CustomerDto> CreateAsync(CreateCustomerDto input)
        {
            return _customerAppService.CreateAsync(input);
        }

        /// <summary>
        /// 删除对象
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete]
        [Route("{id}")]
        public Task DeleteAsync(string id)
        {
            return _customerAppService.DeleteAsync(id);
        }

        /// <summary>
        /// 根据ID获取指定对象
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet]
        [Route("{id}")]
        public Task<CustomerDto> GetAsync(string id)
        {
            return _customerAppService.GetAsync(id);
        }

        /// <summary>
        /// 分页获取列表记录
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet]
        public Task<PagedResultDto<CustomerDto>> GetListAsync(CustomerPagedDto input)
        {
            return _customerAppService.GetListAsync(input);
        }

        /// <summary>
        /// 更新对象
        /// </summary>
        [HttpPut]
        [Route("{id}")]
        public Task<CustomerDto> UpdateAsync(string id, CustomerDto input)
        {
            return _customerAppService.UpdateAsync(id, input);
        }

        /// <summary>
        /// 获取字段列别名
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [Route("columnalias")]
        public Task<Dictionary<string, string>> GetColumnNameAlias()
        {
            return _customerAppService.GetColumnNameAlias();
        }
    }
12-31 16:29