美文网首页
Asp.netCoreWebAPI 实战项目(一)

Asp.netCoreWebAPI 实战项目(一)

作者: 王清水 | 来源:发表于2020-12-04 20:51 被阅读0次

    本实例适用于初学者,大牛可绕道;本实例需要有一定的c#基础;

    技术相关:Asp.netCoreWebAPI 3.1 、SQLServer、EFCore、Session、自制简单缓存、爬虫 等;
    业务场景:球类数据分析项目,用户权限管理【精确至API调用】、用户对比赛数据的上传,联赛-比赛-分析师之间的设置管理,比赛结果的自动结算和支持手动异常比赛、
    分析师分析结果整合,比赛结果动态策略支持,相关策略数据分析等

    【注意是3.1版本】;前端为vue2【cli3】,使用减缩版自构架子,配合后端权限管理;
    前后端均重构2版本,个人完成,不懂可问,有空可回答,完成此部分+结合您自己的webApi部分,可完成一个完整的后端模板架子;

    成果展示:

    登录页 后台部分界面

    项目目录

    文件目录,v2为重构版本

    a,Automapper 文件中定义AutoMapper对象映射以及支持自定义方法转换,多对多转换等,面对需求变更时,使用起来很方便;
    b,CommonBaseUtility文件中定义整个项目中通用的类,比如读取自定义设置的类;定义通用的枚举;
    c,Controller 自然是webApi控制层,调用和组合具体实现的文件夹;
    d,DataLayer 文件定义接口层+接口实现层,提供给Controller层组合和调用;这样的好处在于,当需求变化时,不必修改Controller层级的调用和组合,只需要修改实现或者添加新的实现;
    e,Dbs 文件定义数据库Context,实现EFCore设置相关;当有多个数据库时,都写在这里,还可以实现一些多数据库的统一配置和方法【这里未做实验,预想如此】;
    f,Dtos 返回前端的数据格式对象,定义Dto,使用AutoMapperDto和数据库实例映射,减少客户端输出多余的字段,当然,后端webApi可以加入fileds字符串字段,由前端发送具体fileds返回,在Dto层级再次减少传输层级的体量;
    g,DtosValidators 文件定义webApi传输参数的验证,虽然Asp自带了参数验证,但是为了统一和更为人性化的写法和用法,这里使用Fluentvalidation,并屏蔽自带方法,可自行查阅相关资料;
    h,Entities 定义数据库数据实例;
    i,Helper 文件定义公共方法,某些函数式的抽象等;
    j,Manager 文件定义缓存管理,设置管理以及定时Timer任务;
    k,Migrations  文件为自动生成文件,提供数据库字段更新,版本数据统一;
    l,appsettings.json 定义系统设置,这里我将sqlserver数据库连接字符、允许访问的地址信息填入;
    m,.pfx为证书
    n,SystemSettings.json 为自定义的设置json文件,这里的json提供内存修改和文件修改;
    o,nlog.config 使用NLog相关设置;
    其他, 。。。待会讲;


    一,项目Program类

    3333为本地调试端口,7979为https调用端口;设置NLOG使用,证书的使用;

    设置端口的写法很多,可自行查询,创建主机实例,会读取Startup类;
    【用处:设置端口,设置NLog,设置证书等;】


    二,Startup类【重点,依赖注入和通道使用等】

    1,Startup构造函数

    定义需读取的数据库连接字符串和运行访问的地址;ConfigSetting是自实现的类,作用是注册设置相关数据,支持文件修改

    可以写成静态字段,这样,可供全局读取;
    【Setting文件变更,需求:系统数据规定12点后上传,但是现在改为13点,那么通过这个设置修改为13点,响应的.json文件内容也变为13点,不仅仅是内存读取,这样方式服务重启后,数据还是12点】


    2,依赖注入

    本项目要注入或需处理的依赖为上图所示

    a,时间验证去除T,是因为业务有大量的时间处理,这里,如果时间格式很容易写错,so。。。
    写上一句: services.AddControllers().AddNewtonsoftJson();

    b,autoMapper  程序集方式  写上上一句:services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

    c,添加依赖包MemoryCache缓存和自制的简单缓存管理
    services.AddMemoryCache();
    services.AddSingleton<InItCache>(new InItCache(ConnectionString));
    MemoryCache在本项目中未使用,而是使用自己写的读取数据库的缓存添加管理,由于要实现连接数据库,自制的管理器中要使用await方法,否则不能保证,该实现已经达到了自己的架构目的;

    d,samesite设置

    其实是在session中设置,本地调试设置为Unspecified即可

    本项目我在调试的时候,使用vue2 中axios设置自动保留session,但是登陆后,Chrome浏览器返回未登录,某些版本则不会,这里必须设置哦

    e,注册Controller

    将数据层使用Scoped模式注入,写上DataLayer层里面的接口+实现即可;
    如: services.AddScoped<IUserDataLayer, UserDataLayer>();
    将定时任务以Singleton模式注入,服务启动时,启动定时任务;【这里将定时任务会定时爬取比赛数据,将已完场的数据自动更新到数据库中】

    f,数据库连接池

    services.AddDbContextPool<HiAdminDbV2Context>(o => o.UseSqlServer(ConnectionString, b => b.MaxBatchSize(2014).MinBatchSize(2).MigrationsAssembly("HiAdminV2")));

    g,跨域设置

    根据appSetting设置的值,读取允许跨域的设置,并设置

    设置中,我写到 "AllowedOrgs": "http://localhost:9797,http://localhost:8080,http://192.168.100.133:9797,https://www.football88.ml:9797",
    所以上述拿逗号分割读取

    h,mvc 和 Validation注入

    Mvc体量很大,这里尝试过很多写法注册session,但是都未成功,而FluentValidation是需要多次注入的

    FluentValidation实现了一整套的提示和检测,在项目中使用会比较规整,如登录时参数验证:

    定义登录传参规范

    这里如果参数验证失败,需要使用拦截器重写,这样才能实现FluentValidation的整个功能

    如果检测未通过,则只返回第一个错误,即参数的检测

    上面的validator实现,是可以重复使用的,但是建议非原始结构不要重复使用,因为需求变动会让人想屎

    i,启动Response压缩

    本项目的第一版本,由于各种奇怪的需求,有时候会造成一个api返回资源需要6s以上,在服务器没有缓存的情况下,在前端没有时间来架构的情况下,使用压缩是能提高性能的

    压缩相关设置

    关于再详细的压缩算法相关,可自行查资料

    j,swagger

    Swagger提供对接文档,只要写得够细,注释就有细,上传服务器上后,可以在Swagger的页面上测试所有API

    Swagger设置

    这里发布的时候,如果是选择本地文件打包,需要去找到.xml文件,放入打包好的类目中

    k,设置内存型的设置管理,其实就是把设置读取到一个对象中,在controller中使用时,采用注入方式即可,这里的对象属性不应该被修改原始文件内容,这是跟自定义的修改文件类型的区别,大多数项目都会采用此类方法

    这里假设注册的是SystemSettings,需要有这么一个对象,本项目中未使用,实际项目中我是注释的

    配置相关设置,是根据需求的不同来设置的,有些在数据库中,有些在文件中,有些只是临时计算一下,有些需要实时计算,计算的后是否生效,怎么生效,立即生效?立即生效对实际业务的影响等等,这些都是需要考虑的问题;

    l,services.AddControllers();   //注册Controller

    三, Configure方法  通道设置

    注册完成后,每一次的请求都会从通关通过,每一个通道的设置会都会有自己的处理,如果未通过将返回失败或错误,如果写过Node的Koa2,和洋葱模型很相似;

    通道设置相关

    通道设置有顺序问题,这里如果根据您的项目需求,没有通过的话,不妨查一查这里;
    注释掉的鉴权,本来想使用的是IdentityServer4,但是后面时间不够,只能退而求其次,使用方法实现了权限鉴定;这将在下一节中讲到。

    相关文章

      网友评论

          本文标题:Asp.netCoreWebAPI 实战项目(一)

          本文链接:https://www.haomeiwen.com/subject/cjficktx.html