欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 编程语言 > >内容正文

asp.net

基于 abp vnext 和 .net core 开发博客项目 -凯发k8官方网

发布时间:2025/1/21 17 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 基于 abp vnext 和 .net core 开发博客项目 - 统一规范api,包装返回模型 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

基于 abp vnext 和 .net core 开发博客项目 - 统一规范api,包装返回模型

转载于:https://github.com/meowv/blog

在实际开发过程中,每个公司可能不尽相同,但都大同小异,我们的返回数据都是包裹在一个公共的模型下面的,而不是直接返回最终数据,在返回参数中,显示出当前请求的时间戳,是否请求成功,如果错误那么错误的消息是什么,状态码(状态码可以是我们自己定义的值)等等。可能显得很繁琐,没必要,但这样做的好处毋庸置疑,除了美化了我们的api之外,也方便了前端同学的数据处理。

我们将统一的返回模型放在.toolkits层中,之前说过这里主要是公共的工具类、扩展方法。

新建一个base文件夹,添加响应实体类serviceresult.cs,在enum文件夹下单独定义一个serviceresultcode响应码枚举,0/1。分别代表 成功和失败。

//serviceresultcode.cs
namespace meowv.blog.toolkits.base.enum
{
///
/// 服务层响应码枚举
///
public enum serviceresultcode
{
///
/// 成功
///
succeed = 0,

/// /// 失败/// failed = 1, }

}
//serviceresult.cs
using meowv.blog.toolkits.base.enum;
using system;

namespace meowv.blog.toolkits.base
{
///
/// 服务层响应实体
///
public class serviceresult
{
///
/// 响应码
///
public serviceresultcode code { get; set; }

/// /// 响应信息/// public string message { get; set; }/// /// 成功/// public bool success => code == serviceresultcode.succeed;/// /// 时间戳(毫秒)/// public long timestamp { get; } = (datetime.now.touniversaltime().ticks - 621355968000000000) / 10000;/// /// 响应成功/// /// /// /// public void issuccess(string message = ""){message = message;code = serviceresultcode.succeed;}/// /// 响应失败/// /// /// /// public void isfailed(string message = ""){message = message;code = serviceresultcode.failed;}/// /// 响应失败/// /// /// public void isfailed(exception exception){message = exception.innerexception?.stacktrace;code = serviceresultcode.failed;} }

}
可以看到,还定义了 string 类型的 message,bool 类型的 success,success取决于code == serviceresultcode.succeed的结果。还有一个当前的时间戳timestamp。

其中还有issuccess(…)和isfailed(…)方法,当我们成功返回数据或者当系统出错或者参数异常的时候执行,这一点也不难理解吧。

这个返回模型暂时只支持无需返回参数的api使用,还需要扩展一下,当我们需要返回其它各种复杂类型的数据就行不通了。所以还需要添加一个支持泛型的返回模型,新建模型类:serviceresultoft.cs,这里的t就是我们的返回结果,然后继承我们的serviceresult,指定t为class。并重新编写一个issuccess(…)方法,代码如下:

//serviceresultoft.cs
using meowv.blog.toolkits.base.enum;

namespace meowv.blog.toolkits.base
{
///
/// 服务层响应实体(泛型)
///
///
public class serviceresult : serviceresult where t : class
{
///
/// 返回结果
///
public t result { get; set; }

/// /// 响应成功/// /// /// public void issuccess(t result = null, string message = "")

{
message = message;
code = serviceresultcode.succeed;
result = result;
}
}
}
此时针对无需返回参数和需要返回参数的api都可以满足要求了。但是还有一种就没办法了,那就是带分页的数据,我们都应该知道想要分页,数据总数肯定是必不可少的。

所以此时还需要扩展一个分页的响应实体,当我们使用的时候,直接将分页响应实体作为上面写的serviceresult中的t参数,即可满足需求。

新建文件夹paged,添加总数接口ihastotalcount、返回结果列表接口ilistresult

//ihastotalcount.cs
namespace meowv.blog.toolkits.base.paged
{
public interface ihastotalcount
{
///
/// 总数
///
int total { get; set; }
}
}

//ilistresult.cs
using system.collections.generic;

namespace meowv.blog.toolkits.base.paged
{
public interface ilistresult
{
///
/// 返回结果
///
ireadonlylist item { get; set; }
}
}
ilistresult接受一个参数,并将其指定为ireadonlylist返回。

现在来实现ilistresult接口,新建listresult实现类,继承ilistresult,在构造函数中为其赋值,代码如下:

//listresult.cs
using system.collections.generic;

namespace meowv.blog.toolkits.base.paged
{
public class listresult : ilistresult
{
ireadonlylist item;

public ireadonlylist item{get => item ?? (item = new list());set => item = value;}public listresult()

{
}

public listresult(ireadonlylist item)

{
item = item;
}
}
}
最后新建我们的分页响应实体接口:ipagedlist和分页响应实体实现类:pagedlist,它同时也要接受一个泛型参数 t。

接口继承了ilistresult和ihastotalcount,实现类继承listresult和ipagedlist,在构造函数中为其赋值。代码如下:

//ipagedlist.cs
namespace meowv.blog.toolkits.base.paged
{
public interface ipagedlist : ilistresult, ihastotalcount
{
}
}

//pagedlist.cs
using meowv.blog.toolkits.base.paged;
using system.collections.generic;

namespace meowv.blog.toolkits.base
{
///
/// 分页响应实体
///
///
public class pagedlist : listresult, ipagedlist
{
///
/// 总数
///
public int total { get; set; }

public pagedlist(){}public pagedlist(int total, ireadonlylist result) : base(result){total = total;} }

}
到这里我们的返回模型就圆满了,看一下此时下我们的项目层级目录。

图片

接下来去实践一下,修改我们之前创建的增删改查接口的返回参数。

//iblogservice.cs
using meowv.blog.application.contracts.blog;
using meowv.blog.toolkits.base;
using system.threading.tasks;

namespace meowv.blog.application.blog
{
public interface iblogservice
{
//task insertpostasync(postdto dto);
task insertpostasync(postdto dto);

//task deletepostasync(int id);task deletepostasync(int id);//task updatepostasync(int id, postdto dto);task> updatepostasync(int id, postdto dto);//task getpostasync(int id);task> getpostasync(int id); }

}

接口全部为异步方式,用serviceresult包裹作为返回模型,添加和更新t参数为string类型,删除就直接不返回结果,然后查询为:serviceresult,再看一下实现类:

//blogservice.cs

public async task insertpostasync(postdto dto)
{
var result = new serviceresult();

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);if (post == null){result.isfailed("添加失败");return result;}result.issuccess("添加成功");return result;}public async task deletepostasync(int id){var result = new serviceresult();await _postrepository.deleteasync(id);return result;}public async task> updatepostasync(int id, postdto dto){var result = new serviceresult();var post = await _postrepository.getasync(id);if (post == null){result.isfailed("文章不存在");return result;}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);result.issuccess("更新成功");return result;}public async task> getpostasync(int id){var result = new serviceresult();var post = await _postrepository.getasync(id);if (post == null){result.isfailed("文章不存在");return result;}var dto = new postdto{title = post.title,author = post.author,url = post.url,html = post.html,markdown = post.markdown,categoryid = post.categoryid,creationtime = post.creationtime};result.issuccess(dto);return result;}

当成功时,调用issuccess(…)方法,当失败时,调用isfailed(…)方法。最终我们返回的是new serviceresult()或者new serviceresult()对象。

同时不要忘记在controller中也需要修改一下,如下:

//blogcontroller.cs


public async task insertpostasync([frombody] postdto dto)

...public async task deletepostasync([required] int id)......public async task> updatepostasync([required] int id, [frombody] postdto dto)......public async task> getpostasync([required] int id)...

此时再去我们的swagger文档发起请求,这里我们调用一下查询接口看看返回的样子,看看效果吧。

图片

本篇内容比较简单,主要是包装我们的api,让返回结果显得比较正式一点。那么,你学会了吗?😁😁😁

开源地址:https://github.com/meowv/blog/tree/blog_tutorial

总结

以上是凯发k8官方网为你收集整理的基于 abp vnext 和 .net core 开发博客项目 - 统一规范api,包装返回模型的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

网站地图