项目名称: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. 2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出。如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接

    2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出.如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接 ...

  2. 2021-07-18:最高的广告牌。你正在安装一个广告牌,并希望它高度最大。这块广告牌将有两个钢制支架,两边各一个。每个钢支架的高度必须相等。你有一堆可以焊接在一起的钢筋 rods。举个例子,如果钢筋

    2021-07-18:最高的广告牌.你正在安装一个广告牌,并希望它高度最大.这块广告牌将有两个钢制支架,两边各一个.每个钢支架的高度必须相等.你有一堆可以焊接在一起的钢筋 rods.举个例子,如果钢筋 ...

  3. harbor改造为https---血泪史

  4. MySQL读取的记录和我想象的不一致

    摘要:并发的事务在运行过程中会出现一些可能引发一致性问题的现象,本篇将详细分析一下. 本文分享自华为云社区<MySQL读取的记录和我想象的不一致--事物隔离级别和MVCC>,作者:砖业洋_ ...

  5. python 星号(*) 还能这么用

    哈喽大家好,我是咸鱼 今天跟大家介绍一下 python 当中星号(*)的一些用法 首先大家最常见的就是在 python 中 * 是乘法运算符,实现乘法 sum = 5 * 5 # 25 除此之外,还有 ...

  6. C#/.Net的多播委托到底是啥?彻底剖析下

    前言 委托在.Net里面被托管代码封装了之后,看起来似乎有些复杂.但是实际上委托即是函数指针,而多播委托,即是函数指针链.本篇来只涉及底层的逻辑,慎入. 概括 1.示例代码 public delega ...

  7. ArcPy批量对大量遥感影像相减做差

      本文介绍基于Python中ArcPy模块,对大量栅格遥感影像文件批量进行相减做差的方法.   首先,我们来明确一下本文的具体需求.现有一个存储有多张.tif格式遥感影像的文件夹,其中每一个遥感影像 ...

  8. .Net全网最简Redis操作

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac. Redis作为一款主流的缓存工具在业内已广受欢迎.本文将会介绍操作R ...

  9. Git的基本操作(CUDR)及分支

    ## 安装 到Git官网下载,网站地址:https://git-scm.com/downloads 需要从网上下载一个,然后进行默认安装即可.安装完成后,在开始菜单里面找到 "Git --& ...

  10. 【阅读笔记】Rapid, Detail-Preserving Image Downscaling

    Rapid, Detail-Preserving Image Downscaling(快速的图像缩放技术) 该论文提出了一种基于卷积滤波器的算法,并确定滤波器的权值,使重要的细节保留在缩小比例的图像. ...