gpt4 book ai didi

.NetCore后端架构实战【1-项目分层框架设计】

转载 作者:我是一只小鸟 更新时间:2023-02-15 06:35:43 26 4
gpt4 key购买 nike

摘要:基于.NET Core 7.0WebApi后端架构实战【1-项目结构分层设计】  2023/02/05, ASP.NET Core 7.0, VS2022 。

引言

                              从实习到现在回想自己已经入行四年了,很庆幸自己一直还是从事着开发的工作。这几年不管是工作还是生活都有很多不甘与失落还有
                          
收获,从学校出来之后有时候觉得自己的心态受不了小小的打击,可能就像平凡的世界中的孙少平一样,有着一颗敏感而脆弱的自尊心。春
种一粒粟,秋收万颗子。从2021年1月份到现在一直没有更新过博客,在这个播种的季节我想我应该要总结一下过去的技术经验,对自己是提
升,对别人可能或多或少都有帮助。阿里巴巴大神毕玄曾说过,“一个优秀的工程师和一个普通工程师的区别,不是满天飞的架构图,他的功
底体现在所写的每一行代码上”。这句话我与诸君共思共勉!

分层目标

  • 大道至简:能提高开发效率,让刚进公司的实习生也能快速上手CRUD
  • 结构清晰:不仅要遵循DIP原则(降低耦合),而且也要保证每一层或每一个类库职责单一,减少后期维护成本
  • 扩展/复用:分层之后有很高的复用性和更方便的横向扩展性

传统三层架构

传统的三层架构:表现层、业务逻辑层和数据访问层,如下图所示:

DDD四层架构

 基于DDD的四层架构:用户接口层、应用层、领域层和基础设施层,如下图所示:

与传统的三层架构相比DDD的分层架构将业务逻辑层拆为了应用层与领域层 。

下方左图为传统四层架构,右图为依赖倒置后的四层架构。应用层与领域层提供接口,基础设施层提供实现。领域层不依赖任何一层,只专注与业务。个人认为基础设施层迭代频率要低于接口层,抽象程度高于表现层。所以让表现层依赖基础设施层更合适.

我的本系列博客对应的项目也是基于DDD的架构思想,当然也会加入自己的一些想法在其中.

想学习领域驱动设计的同学可移步 《DDD 实战课》 。

项目结构

整体项目结构如下方三张图所示:

层级介绍

1.ICore.WebApi 这一层主要构建 RESTful 应用程序,提供HTTP服务。管道中间件、过滤器、跨域、路由、模型验证等都在此配置.

2.ICore.Application 这一层很薄,不会包含任何与业务有关的逻辑信息,将使用CQRS的设计模式。安全认证、权限校验、事务控制、发送或订阅领域事件等都可在此层做处理.

3.ICore.Task 这一层主要用于处理系统内小型定时任务。繁多、复杂的定时任务建议用第三方调度平台,例如:XXL-JOB.

4.ICore.Domain.Core 这一层主要用于实现核心的业务逻辑!内部主要包含Entity(实体)、Domain Event(领域事件)、Domain Service(领域服务)等.

5.ICore.Domain.Abstractions 这一层主要用于定义一些基类的接口和领域事件的接口。例如:IAggregateRoot聚合根接口、IEntity、IEntity<TKey> 实体接口等.

6.ICore.Infrastructure.Core 这一层主要对整个应用程序提供基础实现,例如仓储的实现、工作单元模式的实现、Redis缓存、队列服务等.

7.ICore.Test 这一层主要用于对整个程序的单元测试,减少不必要的BUG以及提高测试效率.

其它规范

编码、格式规范

我强烈建议大家看阿里巴巴Java开发手册,以上面的规范来约束自己的编码.

配置文件规范

  • 全部采用json格式文件
  • 建立映射类,使用IOptions<T>方式读取配置信息
  • 数据库连接字符串、数据传输的加密密钥等不建议写在配置文件中,应放到分布式配置中心中

安全规范(只列举部分)

  • 加入恶意请求IP黑名单
  • 防SQL注入攻击
  • 日志应记录请求时间、操作人ID、IP地址、是否成功等重要信息
  • CORS策略应加上白名单限制
  • 生产环境的接口文档不对外暴露

启动项目

首先.Net Core同Spring Boot一样都是自宿主程序,其不是必需在IIS内部托管。实现跨平台离不开.Net Core内置的kestrel高性能服务器,如下图所示(图片来自官网)

修改端口

1、在 launchSettings.json 文件中修改站点信息,把IIS Express节点删掉 。

2、在 appsettings.json 中设置启动端口 。

                          
                             " 
                             Kestrel 
                             " 
                             : { 
                             " 
                             Endpoints 
                             " 
                             : { 
                             " 
                             Https 
                             " 
                             : { 
                             " 
                             Url 
                             " 
                            : 
                             " 
                             https://*:8000 
                             " 
                             }, 
                             " 
                             Http 
                             " 
                             : { 
                             " 
                             Url 
                             " 
                            : 
                             " 
                             http://*:8001 
                             " 
                             } } } 
                            
                          
                        

3、在 Program 中设置启动端口 。

                          
                            app.Run(
                             " 
                             http://*:8001 
                             " 
                            );
                          
                        

加入Startup.cs

从.Net6.0开始已去除了Startup.cs 文件,依赖注入服务和Middleware全在Program.cs中配置.

我从写.Net Core2.0开始一直到现在,Startup.cs文件我觉得还是有必要存在,个人使用习惯而已😉 。

改造Program.cs

                          
                             using 
                             ICore.WebApi; 
                             var 
                             builder =
                             WebApplication.CreateBuilder(args); 
                             var 
                             startup = 
                             new 
                             Startup(builder.Configuration); startup.ConfigureServices(builder.Services); startup.Configure(builder.Build()); 
                            
                          
                        

重写Startup.cs

                          
                             namespace 
                             ICore.WebApi { 
                             public 
                             class 
                             Startup { 
                             public 
                             IConfiguration Configuration { 
                             get 
                             ; } 
                             public 
                             Startup(IConfiguration configuration) => Configuration =
                             configuration; 
                             // 
                             This method gets called by the runtime. Use this method to add services to the container. 
                             public 
                             void 
                             ConfigureServices(IServiceCollection services) { services.AddControllers(); 
                             // 
                             Learn more about configuring Swagger/OpenAPI at 
                             https://aka.ms/aspnetcore/swashbuckle 
                             services.AddEndpointsApiExplorer(); services.AddSwaggerGen(); } 
                             // 
                             This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
                             public 
                             void 
                             Configure(WebApplication app) { 
                             if 
                             (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseAuthorization(); app.MapControllers(); app.Run( 
                             " 
                             http://*:8001 
                             " 
                             ); } } } 
                            
                          
                        

Run起来!

使用命令行启动 dotnet ICore.WebApi.dll --urls="http://*:8001" --ip="127.0.0.1" --port=8001 。

这一节就到这里,后面会继续上新!😊 。

最后此篇关于.NetCore后端架构实战【1-项目分层框架设计】的文章就讲到这里了,如果你想了解更多关于.NetCore后端架构实战【1-项目分层框架设计】的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com