欢迎访问 生活随笔!

凯发k8官方网

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

asp.net

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

发布时间:2025/1/21 13 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

基于 abp vnext 和 .net core 开发博客项目 - 完善与美化,swagger登场

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

在程序员界,总有一批强迫症患者,他们希望自己写的代码看起来尽量的完美无瑕疵。

完善与美化

直奔主题,首先将各项目层的项目文件(.csproj)打开,格式化一下,没有引用这句代码的也加一下,这里其实就是将公共属性拿出来,没什么特殊的。

common.props中的代码也非常简单,主要是禁用当开启输出xml的时候没有给代码进行summary注释产生的警告,其实这些大可不必为之折腾,不影响项目的成功运行。如果您觉得没啥必要,完全可以跳过此小节看最后。

.application

.application层现在只引用volo.abp.identity.application包,和依赖.application.caching、.application.contracts、.domain.shared三个项目。

//meowv.blog.application.csproj

netcoreapp3.1

.application.caching

.application.caching层看名字就知道,我准备用它来处理缓存,这里会用到两个包,volo.abp.caching、microsoft.extensions.caching.redis

不管三七二十一,新建一个模块类meowvblogapplicationcachingmodule.cs,依赖于abpcachingmodule和我们的meowvblogdomainmodule模块(此时还没添加)

using volo.abp.caching;
using volo.abp.modularity;

namespace meowv.blog.application.caching
{
[dependson(
typeof(abpcachingmodule)
// …
)]
public class meowvblogapplicationcachingmodule : abpmodule
{
public override void configureservices(serviceconfigurationcontext context)
{
base.configureservices(context);
}
}
}

//meowv.blog.application.caching.csproj

netcoreapp3.1

.application.contracts

删掉里面所有文件,.application.contracts层我不准备按照abp那样来做,此层我只想用来放我们的传输对象(dto),添加项目引用domain.shared,同时开启输出xml文件到我们.httpapi.hosting

输出xml很简单,在 visual studio 中对着项目 右键=>属性=>生成=>输出,然后选择xml文档文件,默认为一个物理路径,我们将其改为相对路径…\meowv.blog.httpapi.hosting\meowv.blog.application.contracts.xml,xml输出到.httpapi.hosting层。

也可以直接修改项目文件实现,如下

//meowv.blog.application.contracts.csproj

netcoreapp3.1 ..\meowv.blog.httpapi.hosting\meowv.blog.application.contracts.xml

.domain

.domain层为我们的实体领域模型,不需要引用其它层,只添加包volo.abp.identity.domain,同时也输出一下xml文件,xml文件的作用后续swagger会用的。

//meowv.blog.domain.csproj

netcoreapp3.1 ..\meowv.blog.httpapi.hosting\meowv.blog.domain.xml

删掉此层所有文件,不要忘了添加模块类,meowvblogdomainmodule.cs,它依赖abpidentitydomainmodule模块

using volo.abp.identity;
using volo.abp.modularity;

namespace meowv.blog.domain
{
[dependson(typeof(abpidentitydomainmodule))]
public class meowvblogdomainmodule : abpmodule
{

}

}

此时上面.application.caching中可以将meowvblogdomainmodule加上了。

//meowvblogapplicationcachingmodule.cs

[dependson(
typeof(abpcachingmodule),
typeof(meowvblogdomainmodule)
)]
public class meowvblogapplicationcachingmodule : abpmodule
{

}

.domain.shared

.domain.shared层相当于.domain的一个扩展一样,这里放一下项目用到的枚举、公共常量等内容,需要引用我们的.domain项目

netcoreapp3.1 还是要新增一个模块类meowvblogdomainsharedmodule.cs,它依赖abpidentitydomainsharedmodule模块

//meowvblogdomainsharedmodule.cs
using volo.abp.identity;
using volo.abp.modularity;

namespace meowv.blog.domain
{
[dependson(typeof(abpidentitydomainmodule))]
public class meowvblogdomainmodule : abpmodule
{
}
}

.entityframeworkcore

.entityframeworkcore层同样的,先删掉默认生成的文件。它主要是集成了ef core,自定义仓储。详细可以看看abp文档:https://docs.abp.io/zh-hans/abp/latest/repositories

它支持多种数据库 mysql、sqlserver、postgresql、sqlite等,如果你有用到mongodb,则需要新建一个项目,单独实现。可以看官方文档,有时间可以分享具体方法,本项目用不到。https://docs.abp.io/zh-hans/abp/latest/mongodb

为了方便大家,我把以上4种主流数据库都集成到项目中,添加包volo.abp.entityframeworkcore.mysql,.postgresql、.sqlite、.sqlserver,同时引用.domain.shared项目

//meowv.blog.entityframeworkcore.csproj

netcoreapp3.1

新建一个模块类meowvblogframeworkcoremodule.cs,依赖meowvblogdomainmodule和数据库模块

//meowvblogframeworkcoremodule.cs
using meowv.blog.domain;
using volo.abp.entityframeworkcore;
using volo.abp.entityframeworkcore.mysql;
using volo.abp.entityframeworkcore.postgresql;
using volo.abp.entityframeworkcore.sqlite;
using volo.abp.entityframeworkcore.sqlserver;
using volo.abp.modularity;

namespace meowv.blog.entityframeworkcore
{
[dependson(
typeof(meowvblogdomainmodule),
typeof(abpentityframeworkcoremodule),
typeof(abpentityframeworkcoremysqlmodule),
typeof(abpentityframeworkcoresqlservermodule),
typeof(abpentityframeworkcorepostgresqlmodule),
typeof(abpentityframeworkcoresqlitemodule)
)]
public class meowvblogframeworkcoremodule : abpmodule
{
public override void configureservices(serviceconfigurationcontext context)
{

} }

}

.entityframeworkcore.dbmigrations

.entityframeworkcore.dbmigrations层主要做数据库迁移,用code-first方式创建数据库表,先删掉默认生成的文件,目前还用不上,后面讲。

.toolkits

.toolkits层是我们手动创建的项目,我主要用它来包装一些扩展方法,公共的工具类。

swagger登场

做.net core开发的,相信swagger的使用大家应该都很熟悉了,不做过多的介绍,今天只先将其用上看看效果。

我单独为swagger新建了一个项目meowv.blog.swagger,其实大可不必,直接写在.httpapi.hosting中也是一样的。

添加volo.abp.aspnetcore和swashbuckle.aspnetcore包,引用实体层.domain。

//meowv.blog.swagger.csproj

netcoreapp3.1

添加模块类meowvblogswaggermodule.cs,依赖meowvblogdomainmodule模块,并且重写configureservices和onapplicationinitialization方法,不知道这是什么的,可以看文档:https://docs.abp.io/zh-hans/abp/latest/module-development-basics

然后新建一个扩展类meowvblogswaggerextensions.cs,编写两个扩展方法addswagger和useswaggerui。

在addswagger方法中引用我们的xml文件,配置接口的名称版本以及描述信息,在useswaggerui方法中使用swaggerui,代码如下:

//meowvblogswaggerextensions.cs
using microsoft.aspnetcore.builder;
using microsoft.extensions.dependencyinjection;
using microsoft.openapi.models;
using system;
using system.io;

namespace meowv.blog.swagger
{
public static class meowvblogswaggerextensions
{
public static iservicecollection addswagger(this iservicecollection services)
{
return services.addswaggergen(options =>
{
options.swaggerdoc(“v1”, new openapiinfo
{
version = “1.0.0”,
title = “我的接口啊”,
description = “接口描述”
});

options.includexmlcomments(path.combine(appcontext.basedirectory, "meowv.blog.httpapi.xml"));options.includexmlcomments(path.combine(appcontext.basedirectory, "meowv.blog.domain.xml"));options.includexmlcomments(path.combine(appcontext.basedirectory, "meowv.blog.application.contracts.xml"));});}public static void useswaggerui(this iapplicationbuilder app){app.useswaggerui(options =>{options.swaggerendpoint($"/swagger/v1/swagger.json", "默认接口");});} }

}

随后便可以在模块meowvblogdomainmodule中引用了

//meowvblogswaggermodule.cs
using meowv.blog.domain;
using microsoft.aspnetcore.builder;
using volo.abp;
using volo.abp.modularity;

namespace meowv.blog.swagger
{
[dependson(typeof(meowvblogdomainmodule))]
public class meowvblogswaggermodule : abpmodule
{
public override void configureservices(serviceconfigurationcontext context)
{
context.services.addswagger();
}

public override void onapplicationinitialization(applicationinitializationcontext context){context.getapplicationbuilder().useswagger().useswaggerui();} }

}

最后在.httpapi.hosting层的的启动模块中引用一下。

//meowvbloghttpapihostingmodule.cs

[dependson(
typeof(abpaspnetcoremvcmodule),
typeof(abpautofacmodule),
typeof(meowvbloghttpapimodule),
typeof(meowvblogswaggermodule),
typeof(meowvblogframeworkcoremodule)
)]
public class meowvbloghttpapihostingmodule : abpmodule
{

}

ctrl shift b生成凯发k8官方网的解决方案,ctrl f5打开 …/swagger/index.html 看看效果,上面有一个坑没有填,不知道大家发现了没有,meowv.blog.httpapi.xml没有生成,启动是是会报错的,大家按照之前的方法自行生成xml即可。

图片

棒!预期已经达到了。swagger之所以想单独创建一个项目是因为还涉及到很多内容,如接口分组、jwt授权、还有swagger文档描述信息的filter等。

项目中还剩下.backgroundjobs层没有处理,此层准备集成hangfire做一个定时任务处理的,后面会慢慢用起来的。

现在再回头看看,项目是不是很清爽? 没有乱七八糟的东西,有的只是我们需要的。

此时的层级目录,以供参考。

图片

项目中可能有许多不是很合理的地方,请酌情参考。因为大佬们都不愿意出来分享,所以我们渣渣只能做到这种程度,如果有错误欢迎指正,谢谢。

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

总结

以上是凯发k8官方网为你收集整理的的全部内容,希望文章能够帮你解决所遇到的问题。

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

  • 上一篇:
  • 下一篇:
网站地图