基于 abp vNext 和 .NET Core 开发博客项目 - 自定义仓储之增删改查 (3)

实现服务接口除了要继承我们的IBlogService外,不要忘了还需依赖我们的ServiceBase类。由于我们之前直接接入了Autofac,可以直接使用构造函数依赖注入的方式。

//BlogService.cs using Meowv.Blog.Application.Contracts.Blog; using Meowv.Blog.Domain.Blog.Repositories; using System; using System.Threading.Tasks; namespace Meowv.Blog.Application.Blog.Impl { public class BlogService : ServiceBase, IBlogService { private readonly IPostRepository _postRepository; public BlogService(IPostRepository postRepository) { _postRepository = postRepository; } ... } }

现在就可以实现我们写的IBlogService接口了。

先写添加,这里实现方式全采用异步的方法,先构建一个Post实体对象,具体内容参数都从PostDto中获取,由于主键之前设置了自增,这里就不用管它了。然后调用 await _postRepository.InsertAsync(entity);,正好它返回了一个创建成功的Post对象,那么我们就可以判断对象是否为空,从而确定文章是否添加成功。

代码如下:

... public async Task<bool> InsertPostAsync(PostDto dto) { var entity = new Post { Title = dto.Title, Author = dto.Author, Url = dto.Url, Html = dto.Html, Markdown = dto.Markdown, CategoryId = dto.CategoryId, CreationTime = dto.CreationTime }; var post = await _postRepository.InsertAsync(entity); return post != null; } ...

然后在.HttpApi层和之前添加HelloWorldController一样,添加BlogController。调用写的InsertPostAsync方法,如下:

//BlogController.cs using Meowv.Blog.Application.Blog; using Meowv.Blog.Application.Contracts.Blog; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using Volo.Abp.AspNetCore.Mvc; namespace Meowv.Blog.HttpApi.Controllers { [ApiController] [Route("[controller]")] public class BlogController : AbpController { private readonly IBlogService _blogService; public BlogController(IBlogService blogService) { _blogService = blogService; } /// <summary> /// 添加博客 /// </summary> /// <param></param> /// <returns></returns> [HttpPost] public async Task<bool> InsertPostAsync([FromBody] PostDto dto) { return await _blogService.InsertPostAsync(dto); } } }

添加博客操作,我们将其设置为[HttpPost]方式来提交,因为现在开发接口api,都要遵循RESTful方式,所以就不用给他指定路由了,[FromBody]的意思是在请求正文中以JSON的方式来提交参数。

完成上述操作,打开我们的Swagger文档看看, .../swagger/index.html ,已经出现我们的接口了。

4

随手就试一下这个接口,能否成功创建文章。

5

可以看到数据库已经躺着我们刚刚添加数据内容。

将剩下的三个接口一一实现,相信大家肯定都知道怎么写了。就不逐一唠叨了,代码如下:

... public async Task<bool> DeletePostAsync(int id) { await _postRepository.DeleteAsync(id); return true; } public async Task<bool> UpdatePostAsync(int id, PostDto dto) { var post = await _postRepository.GetAsync(id); post.Title = dto.Title; post.Author = dto.Author; post.Url = dto.Url; post.Html = dto.Html; post.Markdown = dto.Markdown; post.CategoryId = dto.CategoryId; post.CreationTime = dto.CreationTime; await _postRepository.UpdateAsync(post); return true; } public async Task<PostDto> GetPostAsync(int id) { var post = await _postRepository.GetAsync(id); return new PostDto { Title = post.Title, Author = post.Author, Url = post.Url, Html = post.Html, Markdown = post.Markdown, CategoryId = post.CategoryId, CreationTime = post.CreationTime }; } ...

在这里先暂时不做参数校验,咱们默认都是正常操作,如果执行操作成功,直接返回true。大家会发现,当我们使用了DTO后,写了大量对象的转换,在这里暂不做优化,将在后续业务开始后使用AutoMapper处理对象映射。如果大家感兴趣可以自己先试一下。

在Controller中调用,代码如下:

... /// <summary> /// 删除博客 /// </summary> /// <param></param> /// <returns></returns> [HttpDelete] public async Task<bool> DeletePostAsync([Required] int id) { return await _blogService.DeletePostAsync(id); } /// <summary> /// 更新博客 /// </summary> /// <param></param> /// <param></param> /// <returns></returns> [HttpPut] public async Task<bool> UpdatePostAsync([Required] int id, [FromBody] PostDto dto) { return await _blogService.UpdatePostAsync(id, dto); } /// <summary> /// 查询博客 /// </summary> /// <param></param> /// <returns></returns> [HttpGet] public async Task<PostDto> GetPostAsync([Required] int id) { return await _blogService.GetPostAsync(id); } ...

DeletePostAsync:指定了请求方式[HttpDelete],参数id为必填项

UpdatePostAsync:指定了请求方式[HttpPut],参数id为必填项并且为url的一部分,要更新的具体内容和添加博客的方法InsertPostAsync的一样的

GetPostAsync:指定了请求方式[HttpGet],参数id为必填项

ok,打开Swagger文档看看效果,并试试我们的接口是否好使吧,反正我试了是没有问题的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspwps.html