- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
摘要:基于.NET Core 7.0WebApi后端架构实战【1-项目结构分层设计】 2023/02/05, ASP.NET Core 7.0, VS2022 。
从实习到现在回想自己已经入行四年了,很庆幸自己一直还是从事着开发的工作。这几年不管是工作还是生活都有很多不甘与失落还有
收获,从学校出来之后有时候觉得自己的心态受不了小小的打击,可能就像平凡的世界中的孙少平一样,有着一颗敏感而脆弱的自尊心。春
种一粒粟,秋收万颗子。从2021年1月份到现在一直没有更新过博客,在这个播种的季节我想我应该要总结一下过去的技术经验,对自己是提
升,对别人可能或多或少都有帮助。阿里巴巴大神毕玄曾说过,“一个优秀的工程师和一个普通工程师的区别,不是满天飞的架构图,他的功
底体现在所写的每一行代码上”。这句话我与诸君共思共勉!
传统的三层架构:表现层、业务逻辑层和数据访问层,如下图所示:
基于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开发手册,以上面的规范来约束自己的编码.
首先.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
"
);
从.Net6.0开始已去除了Startup.cs 文件,依赖注入服务和Middleware全在Program.cs中配置.
我从写.Net Core2.0开始一直到现在,Startup.cs文件我觉得还是有必要存在,个人使用习惯而已😉 。
using
ICore.WebApi;
var
builder =
WebApplication.CreateBuilder(args);
var
startup =
new
Startup(builder.Configuration); startup.ConfigureServices(builder.Services); startup.Configure(builder.Build());
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
"
); } } }
使用命令行启动 dotnet ICore.WebApi.dll --urls="http://*:8001" --ip="127.0.0.1" --port=8001 。
这一节就到这里,后面会继续上新!😊 。
最后此篇关于.NetCore后端架构实战【1-项目分层框架设计】的文章就讲到这里了,如果你想了解更多关于.NetCore后端架构实战【1-项目分层框架设计】的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
问题情景 混淆群内的小伙伴遇到这么个问题,Mailivery 这个网站登录后,明明提交的表单(邮箱和密码也正确)、请求头等等都没问题,为啥一直重定向到登录页面呢?唉,该出手时就出手啊,我也看看咋回事
实战-行业攻防应急响应 简介: 服务器场景操作系统 Ubuntu 服务器账号密码:root/security123 分析流量包在/home/security/security.pcap 相
背景 最近公司将我们之前使用的链路工具切换为了 OpenTelemetry. 我们的技术栈是: OTLP C
一 同一类的方法都用 synchronized 修饰 1 代码 package concurrent; import java.util.concurrent.TimeUnit; public c
一 简单例子 1 代码 package concurrent.threadlocal; /** * ThreadLocal测试 * * @author cakin */ public class T
1. 问题背景 问题发生在快递分拣的流程中,我尽可能将业务背景简化,让大家只关注并发问题本身。 分拣业务针对每个快递包裹都会生成一个任务,我们称它为 task。task 中有两个字段需要
实战环境 elastic search 8.5.0 + kibna 8.5.0 + springboot 3.0.2 + spring data elasticsearch 5.0.2 +
Win10下yolov8 tensorrt模型加速部署【实战】 TensorRT-Alpha 基于tensorrt+cuda c++实现模型end2end的gpu加速,支持win10、
yolov8 tensorrt模型加速部署【实战】 TensorRT-Alpha 基于tensorrt+cuda c++实现模型end2end的gpu加速,支持win10、linux,
目录如下: 为什么需要自定义授权类型? 前面介绍OAuth2.0的基础知识点时介绍过支持的4种授权类型,分别如下: 授权码模式 简化模式 客户端模式 密码模式
今天这篇文章介绍一下如何在修改密码、修改权限、注销等场景下使JWT失效。 文章的目录如下: 解决方案 JWT最大的一个优势在于它是无状态的,自身包含了认证鉴权所需要的所有信息,服务器端
前言 大家好,我是捡田螺的小男孩。(求个星标置顶) 我们日常做分页需求时,一般会用limit实现,但是当偏移量特别大的时候,查询效率就变得低下。本文将分四个方案,讨论如何优化MySQL百万数
前言 大家好,我是捡田螺的小男孩。 平时我们写代码呢,多数情况都是流水线式写代码,基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢,我觉得,最好的方式就是:使用设计模式优化自己
我们先讲一些arm汇编的基础知识。(我们以armv7为例,最新iphone5s上的64位暂不讨论) 基础知识部分: 首先你介绍一下寄存器: r0-r3:用于函数参数及返回值的传递 r4-r6
一 同一类的静态方法都用 synchronized 修饰 1 代码 package concurrent; import java.util.concurrent.TimeUnit; public
DRF快速写五个接口,比你用手也快··· 实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestfram
一 添加依赖 org.apache.thrift libthrift 0.11.0 二 编写 IDL 通过 IDL(.thrift 文件)定义数据结构、异常和接口等数据,供各种编程语言使用 nam
我正在阅读 Redis in action e-book关于semaphores的章节.这是使用redis实现信号量的python代码 def acquire_semaphore(conn, semn
自定义控件在WPF开发中是很常见的,有时候某些控件需要契合业务或者美化统一样式,这时候就需要对控件做出一些改造。 目录 按钮设置圆角
师父布置的任务,让我写一个服务练练手,搞清楚socket的原理和过程后跑了一个小demo,很有成就感,代码内容也比较清晰易懂,很有教育启发意义。 代码 ?
我是一名优秀的程序员,十分优秀!