项目名称:KeepGoing(继续前进)

1.1介绍

工作后,学习的脚步一直停停走走,希望可以以此项目为基础,可以不断的迫使自己不断的学习以及成长

将以Girvs框架为基础,从壹开始二次开发一个前后端管理框架

在这过程中一步步去学习使用到的技术点,也同时会将在此过程中遇到的问题进行分享

1.2软件采用技术架构

后端开发语言:C#

后端开发平台:.Net6

前端开发框架:Vue3

1.3后端框架搭建

方案整体结构如下



KeepGoing.WebApi Api接口层

KeepGoing.Application 应用层

KeepGoing.Domain 领域层

KeepGoing.Infrastructure 基础数据层

1.4引用Girvs包到对应的项目

KeepGoing.WebApi

  • Girvs.Swagger 主要引用Swagger包,以及Girvs主框架包
  • Microsoft.EntityFrameworkCore.Tools包 数据库迁移文件命令

KeepGoing.Application

  • Girvs.DynamicWebApi 生成动态API
  • Girvs.AuthorizePermission 用户用户授权

KeepGoing.Domain

  • Girvs.AuthorizePermission 用户用户授权

KeepGoing.Infrastructure

  • Girvs.EntityFrameworkCore 数据库持久化

1.5在启动程序中进行注入

ConfigureApplicationServices代码如下



个人对其中一些代码的理解

services.AddBindAppModelConfiguation(configuration, appSettings);

初始化appsettings.json配置文件,并绑定到Configuration

services.AddBindSerilogConfiguation(configuration);

初始化Serilog.json配置文件

IEngine engine = EngineContext.Create();
engine.ConfigureServices(services, configuration);

创建引擎,配置服务

1.6实现用户登录

1.6.1 创建用户实体

在KeepGoing.Domain添加Models文件夹,文件夹下添加User.cs 类文件

public class User : AggregateRoot<Guid>, IIncludeInitField, IIncludeMultiTenant<Guid>, IIncludeCreateTime, IIncludeCreatorId<Guid>
{ /// <summary>
/// 登陆名称
/// </summary>
public string UserAccount { get; set; } /// <summary>
/// 用户密码
/// </summary>
public string UserPassword { get; set; } /// <summary>
/// 用户名称
/// </summary>
public string UserName { get; set; } /// <summary>
/// 用户联系方式
/// </summary>
public string? ContactNumber { get; set; } /// <summary>
/// 用户类型
/// </summary>
public UserType UserType { get; set; } /// <summary>
/// 是否初始化数据
/// </summary>
public bool IsInitData { get; set; } /// <summary>
/// 租户ID
/// </summary>
public Guid TenantId { get; set; } public DateTime CreateTime { get; set; } public Guid CreatorId { get; set; }
}

主要包含用户基础信息

1.6.2 添加 EntityTypeConfiguration

在KeepGoing.Infrastructure下创建EntityConfigurations文件夹,在文件夹下面建立UserEntityTypeConfiguration

主要作用是进行数据库映射,并添加种子数据,以及建议一些索引

1.6.3 添加DbContext

在KeepGoing.Infrastructure创建KeepGoingDbContext.cs类文件

[Girvs.EntityFrameworkCore.DbContextExtensions.GirvsDbConfig("KeepGoing")]

主要用户绑定到指定的数据库配置文件,如果有多个数据库,可以创建多个DbContext类文件,并添加以上特性

启动程序是会在appsettings.json中生成对应的配置节点

启动后的appsettings.json文件大致如下



可以在这里进行数据库配置,下面简单介绍一些参数

UseDataType 连接数据库类型 0 sqlServer 1 mysql

VersionNumber 数据库版本

SQLCommandTimeout 默认执行超时时间

MasterDataConnectionString 主数据库连接字符串

1.6.4添加IUserRepository

在KeepGoing.Domain下创建IRepositories文件夹,文件夹下创建IUserRepository.cs文件

定义一个获取用户接口

1.6.5添加UserRepository

在KeepGoing.Infrastructure下创建Repositories文件夹,文件夹下创建UserRepository.cs文件

实现获取用户接口

1.6.6添加IUserService、UserService

在KeepGoing.Application项目下创建AppService\User文件夹,文件夹下创建IUserService.cs、UserService.cs类文件

定义用户登录获取token接口并进行实现,这里已经封装了Jwt生成Token方法,直接调用



此时,获取用户接口全流程全部完成了

1.6.7 生成迁移文件,并生成数据库

打开程序包管理控制台,设置默认项目为:KeepGoing.WebApi

运行

add-migration init

update-database

这时将会生成对应的数据库

1.6.8 运行项目

这里看到,默认启用了swagger,并增加了Authorize授权,以及获取token接口

闲谈下对DDD的理解

DDD介绍(来源GPT)

DDD(Domain-Driven Design,领域驱动设计)是一种软件开发方法论,主要关注解决复杂业务领域的问题。DDD的核心思想是将软件系统按照真实世界的业务领域模型进行划分和设计,让领域专家和开发团队共同参与设计过程,以实现高内聚、低耦合的架构。

DDD强调将领域模型和业务逻辑置于核心位置,通过分层和模块化的方式构建可复用和可维护的软件系统。它提倡使用统一的语言和概念来描述领域模型,以便于沟通和理解。另外,DDD还推崇使用领域事件、聚合根、实体、值对象等概念来描述和组织领域模型的结构。

除了领域模型的设计,DDD还关注业务模型的边界划分和限界上下文的定义。限界上下文是指业务领域中的一个隔离环境,将特定的业务概念和规则进行封装。这有助于避免不同领域之间的混淆和冲突,同时在大型项目中也可以实现团队的自治和解耦。

DDD还提供了一系列的设计模式和战术技巧,例如聚合根、领域服务、领域事件等,以帮助开发人员更好地实现领域模型和业务逻辑。最终,DDD的目标是提供一种更加灵活、可扩展和可维护的软件设计方法,以适应复杂业务领域的需求。

个人对DDD的理解:

DDD不同于传统三层架构的地方在于它更关注业务,将重点从数据库设计倾向于业务设计,其中的领域事件、聚合根、实体、值对象都是服务于业务。也就是这样它能够应对更为复杂、变化更频繁的业务场景。业务独立且不受干扰,方便扩展以及拆分成各个子系统。

结合自己以及身边的同事,对于DDD、传统框架开发中感受到的不同点进行一个汇总:

1.DDD开发对比传统框架变得更'麻烦',如果能够理解其中各个层级意义,个人觉得是变得更简单

  • 传统架构写增删改查,定义Api接口->业务逻辑处理(BLL)->调用数据访问层(DAL)
  • DDD中写增删改查,查询用到Query查询处理(读请求),增删改用到Command(命令),其中查询输入输出模型又会用到AutoMap转换成领域中使用到的对象

2.DDD层级对比传统框架层级更多,但代码架构更清晰一些

3.DDD整体系统各部分松耦合,可扩展性好

4.CQ两端架构分离、相互不受束缚,各自独立设计、扩展

5.DDD 系统复杂层度更高,一般小型快速开发项目采用传统三层开发效率会高很多

todo...

这上面只是个人的一些理解,如果其中有些错误的地方,还希望大家帮忙指出

从壹开始前后端开发【.Net6+Vue3】的更多相关文章

  1. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十一║Vue实战:开发环境搭建【详细版】

    缘起 哈喽大家好,兜兜转转终于来到了Vue实战环节,前边的 6 篇关于Vue基础文章我刚刚简单看了看,感觉写的还是不行呀,不是很系统,所以大家可能看上去比较累,还是得抽时间去润润色,修改修改语句和样式 ...

  2. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之七 || API项目整体搭建 6.2 轻量级ORM

    更新 1.在使用的时候,特别是更新数据的时候,如果不知道哪里有问题,可以查看数据库 和 实体类 的字段,是否大小写一致,比如 name 和 Name 2.在使用Sqlsugar 的 CodeFirst ...

  3. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

  4. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十一 || AOP自定义筛选,Redis入门 11.1

    代码已上传Github+Gitee,文末有地址 书说上文<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之十 || AOP面向切面编程浅 ...

  5. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探

    更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨 ...

  6. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║Vue基础:JS面向对象&字面量& this字

    缘起 书接上文<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史>,昨天咱们说到了以我的经历说明的web开发经历的 ...

  7. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十六 ║Vue基础:ES6初体验 & 模块化编程

    缘起 昨天说到了<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║ Vue前篇:JS对象&字面量&this>,通过总体来看,好像大家对这一块不是很 ...

  8. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十八║Vue基础: 指令(下)+计算属性+watch

    回顾 今天来晚辣,给公司做了一个小项目,一个瀑布流+动态视频控制的DEMO,有需要的可以联系我,公司的项目就不对外展示了(一个后端程序员真的要干前端了哈哈哈). 书接上文,昨天正式的开始了Vue的代码 ...

  9. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十三║Vue实战:Vuex 其实很简单

    前言 哈喽大家周五好,马上又是一个周末了,下周就是中秋了,下下周就是国庆啦,这里先祝福大家一个比一个假日嗨皮啦~~转眼我们的专题已经写了第 23 篇了,好几次都坚持不下去想要中断,不过每当看到群里的交 ...

  10. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十五║初探SSR服务端渲染(个人博客二)

    缘起 时间真快,现在已经是这个系列教程的下半部 Vue 第 12 篇了,昨天我也简单思考了下,可能明天再来一篇,Vue 就基本告一段落了,因为什么呢,这里给大家说个题外话,当时写博文的时候,只是想给大 ...

随机推荐

  1. 聊聊Mybatis的实现原理

    使用示例 平时我们使用的一般是集成了Spring或是Spring Boot的Mybatis,封装了一层,看源码不直接:如下,看看原生的Mybatis使用示例 示例解析 通过代码可以清晰地看出,MyBa ...

  2. WPF入门教程系列二十六——DataGrid使用示例(3)

    WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...

  3. Bash 编程

    原文:https://seankross.com/the-unix-workbench/bash-programming.html[1] 数学 创建math.sh: #!/usr/bin/env ba ...

  4. 【Python入门教程】获取图片可视化精准定位(逆地理编码)

    ​ 使用exifread库读取图片的经纬度信息(WGS84坐标) 使用高德开放API将经纬度转为高德底图经纬度,并输出具体位置 使用folium库,以高德底图为基准,在网页上可视化显示地图和兴趣点 一 ...

  5. delving into deep imbalanced regression翻译

    非对照翻译,有所简略.翻译不对,尽情谅解,可留言 作者解释 and paper 笔记 Abstract   Real-world data often exhibit imbalanced distr ...

  6. 【C++ Primer】第二章(2 ~ 6节)

    变量 变量提供一个具名的.可供程序操作的存储空间. C++中变量和对象一般可以互换使用. 变量定义(define) 定义形式:类型说明符(type specifier) + 一个或多个变量名组成的列表 ...

  7. SpringMVC的执行原理

    1.HandlerMapping为处理器映射,DispatcherServlet调用HandlerMapping,HandlerMapping根据请求的url查找Handler 2.HandlerEx ...

  8. Aerospike架构设计与实现细节

    目录 1. 引言 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 2.3. 相关技术比较 3. 实现步骤与流程 3.1. 准备工作:环境配置与依赖安装 3.2. 核心模块实现 3 ...

  9. 基于drawio构建流程图编辑器

    基于drawio构建流程图编辑器 drawio是一款非常强大的开源在线的流程图编辑器,支持绘制各种形式的图表,提供了Web端与客户端支持,同时也支持多种资源类型的导出. 描述 在我们平时写论文.文档时 ...

  10. node使用jsonwebtoken生成token与验证是否过期

    场景 我们可以使用 cookie,session,token 来做鉴权. 下面我们来看一下, 如何使用 token 来做鉴权 jwt.sign 的简单介绍 npm install jsonwebtok ...