c#命令
-
dotnet new webapi -n aa 创建wevapi项目
-
dotnet restore 还原依赖包
-
dotnet new classlib -n aa 创建类库
-
dotnet new sln -n aa 创建解决方案
-
dotnet sln MySolution.sln add MyLibrary/MyLibrary.csproj 将项目和类库添加进解决方案,然后 主要是add前后,要指明路径,报错就是路径不对
-
dotnet add …/ reference …/ 引用类库
-
fotnet ef migrations add aa -p 项目路径 -s 启动项目路径
// 项目路径下面所需要的依赖包
// Microsoft.EntityFrameworkCore 提供基本的 Entity Framework Core 功能,包括数据访问建模和查询
// Microsoft.EntityFrameworkCore.Design 提供设计时功能如迁移和逆向工程,用于支持dotnet ef命令
// Microsoft.EntityFrameworkCore.SqlServer 提供和 Entity Framework Core 与 SqlServer 的集成,使程序能够与 SqlServer 通讯
// 启动项目路径所需要的依赖包
// Microsoft.EntityFrameworkCore.Design 提供设计时的功能,如迁移和逆向工程,用于支持dotnet ef命令
// Microsoft.EntityFrameworkCore.Tools 提供 Entity Framework Core CLI 工具使在开发过程中,使用dotnet ef命令来创建管理迁移(一般在电脑上是以全局安装的形式,所以在部署时要注意最好以依赖包的形式来加载)
-
npm init vite 生成vue3项目
-
npm install axios 安装axios
生成迁移文件,同步迁移文件
- dotnet ef migrations add MigrationName
- dotnet ef database update
依赖包
- dotnet add package Microsoft.EntityFrameworkCore 创建实体表
- dotnet add package Microsoft.EntityFrameworkCore.SqlServer 连接数据库
- dotnet add package Microsoft.EntityFrameworkCore.Design 用来生成迁移文件
- 加上版本号就是本地缓存安装
DDD领域驱动设计 一般通过这种设计然后来确定类库的数量和作用
- 实体 唯一表示对象 用户,订单等。。
- 值对象
- 聚合
- 聚合根
- 领域服务
- 仓储
- 工厂
- 上下文
- 防腐层
创建正式的webapi项目
// 一个接口webapi项目,五个类库
1. Admin2024.Api // webapi项目 用于 http 和https 协议,在这个项目里起到接口的作用
2. Admin2024.Application // 应用层 服务层
3. Admin2024.Application.Contracts // 定义应用接口以及dto
4. Admin2024.Domain // 领域层,核心层,用于定义类接口管理类,通常作用于定义表
namespace Admin2024.Domain.Entity.System;
public class AppOperation: BaseEntity
{
// 操作名称,比如有读取(查找、过滤)、新增、修改、导入、导出、打印、放大、最大化
public string OperationName { get; set; } = null!;
public string? Descript { get; set; }
}
5. Admin2024.EntityFrameworkCore // 通常定义创建数据库dot
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(typeof(EntityConfiguration.AppUserConfiguration).Assembly);
}
6. Admin2024.Infrastructure // 基础设施层
// 以上建完需要创建解决方案,然后全部添加进解决方案,并且不同的类库需要引用,上面c#类库有写这么引用这么添加
一下时在操作时的方法分析
在Admin2024.Domain,这里是来创建数据库的表,我选择创建一个抽象类然后去实例
// 定义一个抽象类,通过namespace和class来知道我创建时候文件夹的位置
// 定义抽象类时为了避免在实体类中定义同样的属性和方法
// 保证数据库表的一致性
// 简化和维护
// 实现通用功能
// 领域模型的一部分
// 这里只示范一下抽象类,然后具体的实体类库就不说,因为这个具体的实体类库要根据实际情况或者是自己想要什么效果才建的,就算定义一张表也是可以的
namespace Admin2024.Domain.Entity;
public abstract class BaseEntity
{
// 主键
public Guid Id {get;set;}
public string? BaseCode {get;set;}
// 是否启用激活
public bool IsActived {get;set;}
// 是否删除
public bool IsDeleted {get;set;}
// 创建时间
public DateTime CreatedAt {get;set;}
// 创建人
public Guid CreateBy {get;set;}
// 最后更新时间
public DateTime UpdatedAt {get;set;}
// 最后更新人
public Guid UpdatedBy {get;set;}
// 显示顺序
public int DisplayOrder {get;set;}
// 备注
public string? Remarks {get;set;}
}
命名自动化转换
// 因为c#的命名规范和数据库的命名规范不一样,使用就需要转自动化转换命名
public class MyDbContext : DbContext
{
public DbSet<MyEntity> MyEntities { get; set; }
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 自动将C#属性名转换为数据库列名
foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
foreach (var property in entity.GetProperties())
{
var snakeCaseName = ToSnakeCase(property.Name);
property.SetColumnName(snakeCaseName);
}
}
}
private string ToSnakeCase(string name)
{
if (string.IsNullOrWhiteSpace(name))
return name;
var stringBuilder = new StringBuilder();
for (int i = 0; i < name.Length; i++)
{
var c = name[i];
if (char.IsUpper(c) && i > 0)
{
stringBuilder.Append('_');
}
stringBuilder.Append(char.ToLower(c));
}
return stringBuilder.ToString();
}
}
public class MyEntity
{
public int Id { get; set; }
public string MyProperty { get; set; }
}