介绍

很久没有更新博客了,之前想更新但是发现博客园崩了,外加工作上的调换也比较忙,最近有了点时间我来继续更新下这个系列的文章。

今年3月份我带着我们研发组同事,将公司产品从老Abp重构到Abp vNext目前已经上线,我非常确认Abp vNext完全可以应用到生产环境,并且他足以支撑超复杂业务的系统开发。

很多人提到Abp就想到DDD,这很好,但是Abp并不是要求你一定要DDD,很多人在社区在群里说你不DDD你用Abp还不如不用,Abp你用来开发系统太重了,我其实很像问一下说出这些话的人,你深入用过Abp嘛?你用它开发过复杂的业务系统嘛?你能保证你现在使用的系统能够持久更新嘛?你说Abp很重我就想知道他重的点在哪里?(此处欢迎大佬找我探讨)

这次连载我将由浅入深的来给大家把 Abp vNext 过一遍,该项目作为老张的哲学Blog.Core博客系统姊妹篇,用比较简单的业务来演示你该如何开始使用Abp vNext,DDD我也会涉及到,如果时间允许IdentityServer和模块化我也会讲,反正就是过一遍让你不要太触怕这个东西,话不多说咱们还是直接上项目比较实在。

开始

Abp官网:https://abp.io/

直接创建项目,项目名称:Blog.Core.AbpvNext 我完全是为了看着方便这么叫,注意我选择的Ui是Angular,采用方案是将服务器端和授权分离为两个应用程序,如下图所示。

项目下载下来后修改DbMigrator、Host、IdentityServer的appsettings.json数据库连接字符串。

然后启动DbMigrator生成数据库,生成出来的数据库如下图所示,数据库表包含IdentityServer、用户、角色、组织、审计、Entity、安全、Feature、权限、日志、后台任务、设置等这几类。

项目介绍

我之前写过一个博客站点,如图所示我就根据这个博客站点来简单的分析下模型,模型如下图所示,后面我们会根据业务在进行修改。

创建模型

根据上面的模型把Entity创建一下,目录结构看下图

  public class SiteUser : FullAuditedAggregateRoot<Guid>
{
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 用户
/// </summary>
public string Name { get; set; }
/// <summary>
/// 密码
/// </summary>
public string PassWord { get; set; }
/// <summary>
/// 头像
/// </summary>
public string HeadPortrait { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public string Email { get; set; }
/// <summary>
/// 介绍
/// </summary>
public string Introduce { get; set; }
}
    public class Question:FullAuditedAggregateRoot<Guid>
{
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 类别
/// </summary>
public string Tag { get; set; }
/// <summary>
/// 访问量
/// </summary>
public int Traffic { get; set; } /// <summary>
/// 问答评论
/// </summary>
public virtual ICollection<QuestionComment> QuestionComments { get; set; }
}
    public class QuestionComment:FullAuditedAggregateRoot<Guid>
{
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; } /// <summary>
/// 是否采纳
/// </summary>
public bool IsAdoption { get; set; } /// <summary>
/// 问答信息
/// </summary>
public virtual Question Question { get; set; }
}
    /// <summary>
/// 文章
/// </summary>
public class Article: FullAuditedAggregateRoot<Guid>
{
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 封面
/// </summary>
public string Cover { get; set; }
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 类别
/// </summary>
public string Tag { get; set; }
/// <summary>
/// 访问量
/// </summary>
public int Traffic { get; set; }
/// <summary>
/// 文章评论
/// </summary>
public virtual ICollection<ArticleComment> ArticleComments { get; set; } = new List<ArticleComment>(); }
    public class ArticleComment:FullAuditedAggregateRoot<Guid>
{
/// <summary>
/// 内容
/// </summary>
public string Content { get; set; } /// <summary>
/// 问答Id
/// </summary>
public Guid QuestionId { get; set; }
}

加入上下文并创建映射

在 EntityFrameworkCore层 AbpvNextDbContext 中 将Entity加入到上下文。


public class AbpvNextDbContext : AbpDbContext<AbpvNextDbContext>
{ public DbSet<Article> Articles { get; set; } public DbSet<ArticleComment> ArticleComments { get; set; } public DbSet<Question> Questions { get; set; } public DbSet<QuestionComment> QuestionComments { get; set; } public DbSet<SiteUser> SiteUsers { get; set; }
}

创建 EntityConfigurationGroup 文件夹,创建数据映射配置,如图所示

public class SiteUserCfg : IEntityTypeConfiguration<SiteUser>
{
public void Configure(EntityTypeBuilder<SiteUser> builder)
{
builder.ToTable(AbpvNextConsts.DbTablePrefix + "SiteUser", AbpvNextConsts.DbSchema);
builder.ConfigureByConvention(); builder.Property(e => e.UserName).HasMaxLength(128);
builder.Property(e => e.Name).HasMaxLength(128);
builder.Property(e => e.PassWord).HasMaxLength(256);
builder.Property(e => e.Email).HasMaxLength(128);
builder.Property(e => e.HeadPortrait).HasMaxLength(512);
builder.Property(e => e.Introduce).HasMaxLength(1024); }
}
 public  class ArticleCfg : IEntityTypeConfiguration<Article>
{
public void Configure(EntityTypeBuilder<Article> builder)
{
builder.ToTable(AbpvNextConsts.DbTablePrefix + "Article", AbpvNextConsts.DbSchema);
builder.ConfigureByConvention(); builder.Property(e => e.Title).HasMaxLength(128);
builder.Property(e => e.Cover).HasMaxLength(1024);
// builder.Property(e => e.Content).HasMaxLength(128);
builder.Property(e => e.Tag).HasMaxLength(128); builder.HasMany(e => e.ArticleComments).WithOne()
.HasForeignKey(x => x.ArticleId).IsRequired(false);
}
}
  public class ArticleCommentCfg : IEntityTypeConfiguration<ArticleComment>
{
public void Configure(EntityTypeBuilder<ArticleComment> builder)
{
builder.ToTable(AbpvNextConsts.DbTablePrefix + "ArticleComment", AbpvNextConsts.DbSchema);
builder.ConfigureByConvention(); builder.Property(e => e.Content).HasMaxLength(1024); }
}
    public class QuestionCfg : IEntityTypeConfiguration<Question>
{
public void Configure(EntityTypeBuilder<Question> builder)
{
builder.ToTable(AbpvNextConsts.DbTablePrefix + "Question", AbpvNextConsts.DbSchema);
builder.ConfigureByConvention(); builder.Property(e => e.Title).HasMaxLength(128);
// builder.Property(e => e.Content).HasMaxLength(128);
builder.Property(e => e.Tag).HasMaxLength(128); builder.HasMany(e => e.QuestionComments).WithOne()
.HasForeignKey(x => x.QuestionId).IsRequired(false);
}
}
    public class QuestionCommentCfg : IEntityTypeConfiguration<QuestionComment>
{
public void Configure(EntityTypeBuilder<QuestionComment> builder)
{ builder.ToTable(AbpvNextConsts.DbTablePrefix + "QuestionComment", AbpvNextConsts.DbSchema);
builder.ConfigureByConvention(); builder.Property(e => e.Content).HasMaxLength(1024);
}
}

加入到配置上下文

    public static class AbpvNextDbContextModelCreatingExtensions
{
public static void ConfigureAbpvNext(this ModelBuilder builder)
{
Check.NotNull(builder, nameof(builder)); // 文章
builder.ApplyConfiguration(new ArticleCfg()); builder.ApplyConfiguration(new ArticleCommentCfg()); // 问答
builder.ApplyConfiguration(new QuestionCfg()); builder.ApplyConfiguration(new QuestionCommentCfg()); // 用户
builder.ApplyConfiguration(new SiteUserCfg());
}
}

创建迁移选择 EntityFrameworkCore.DbMigrations 执行 Add-Migration Init_App_Db .

结语

该项目存放仓库在 https://github.com/BaseCoreVueProject/Blog.Core.AbpvNext

QQ群:867095512

项目开发过程中可能随时根据想法进行变化,加油!!!

知识全聚集 .Net Core 技术突破 丨ABP vNext 开始的更多相关文章

  1. 知识全聚集 .Net Core 技术突破 | 我用C#手把手教你玩微信自动化一

    知识全聚集 .Net Core 技术突破 | 我用C#手把手教你玩微信自动化一 教程 01 | 模块化方案一 02 | 模块化方案二 03 | 简单说说工作单元 其他教程预览 分库分表项目实战教程 G ...

  2. 知识全聚集 .Net Core 技术突破 | 简单说说工作单元

    知识全聚集 .Net Core 技术突破 | 简单说说工作单元 教程 01 | 模块化方案一 02 | 模块化方案二 其他教程预览 分库分表项目实战教程 Git地址: https://github.c ...

  3. 知识全聚集 .Net Core 技术突破 | 如何实现一个模块化方案一

    简介 模块化的介绍一共2篇 这一篇我们实现一个功能非常简单的StartupModules模块化. 第二篇我们来实现一个ABP的模块化效果. 思考 其实来简单想一下模块化的实验思路,写个接口=>模 ...

  4. 【HMS Core 6.0全球上线】Network Kit全链路网络加速技术,应用无惧网络拥塞

    HMS Core 6.0已于7月15日全球上线,本次版本向广大开发者开放了众多全新能力与技术.其中HMS Core Network Kit开放了全链路网络加速技术,助力开发者为用户提供低时延的畅快网络 ...

  5. In-Cell、On-Cell和OGS全贴合屏幕技术区别

    昨天刚发布的小米3用的是OGS全贴合屏幕技术,包括魅族MX3也是同样的技术,但是iPhone5是In-Cell屏幕技术,什么才是全贴合?它们之间到底有何区别?哪个好?小编今天就来普及一下全贴合屏幕技术 ...

  6. 基于Kubernetes 构建.NET Core技术中台

    今天下午在腾讯云+社区社区分享了<基于Kubernetes 构建.NET Core技术中台>,下面是演讲内容的文字实录. 我们为什么需要中台 我们现在处于企业信息化的新时代.为什么这样说呢 ...

  7. CCF虚拟现实与可视化技术专委会丨面向增强现实的可视计算技术研究进展概述

    https://mp.weixin.qq.com/s/I-rNwgXHEtwgdpkWzKtVXw 摘要 新一代增强现实技术需要依赖可视计算理论与方法解决大尺度复杂环境下的场景建模.内容生成.感知交互 ...

  8. 2019亚太内容分发大会,阿里云获CDN领袖奖、技术突破奖

    近日,亚太CDN产业联盟主办的2019亚太内容分发大会在上海召开.本次大会以"5G分发"为主题,集结了CDN领域近千名行业领袖.专家参与.在会上,阿里云斩获“CDN领袖奖”.“技术 ...

  9. 基于Kebernetes 构建.NET Core技术中台

    原文:基于Kebernetes 构建.NET Core技术中台 我们为什么需要中台 我们现在处于企业信息化的新时代.为什么这样说呢? 过去企业信息化的主流重心是企业内部信息化.但现在以及未来的企业信息 ...

随机推荐

  1. Lidar激光雷达市场

    Lidar激光雷达市场 近年来,激光雷达技术在飞速发展,从一开始的激光测距技术,逐步发展了激光测速.激光扫描成像.激光多普勒成像等技术,如今在无人驾驶.AGV.机器人等领域已相继出现激光雷达的身影. ...

  2. 多平台Gstreamer Multiplatform

    多平台Gstreamer Multiplatform GStreamer可在所有主要操作系统上运行,例如Linux,Android,Windows,Max OS X,iOS,以及大多数BSD,商业Un ...

  3. 大规模数据处理Apache Spark开发

    大规模数据处理Apache Spark开发 Spark是用于大规模数据处理的统一分析引擎.它提供了Scala.Java.Python和R的高级api,以及一个支持用于数据分析的通用计算图的优化引擎.它 ...

  4. 部署通用基础设施, 满足顶级 SLA 要求

    部署通用基础设施, 满足顶级 SLA 要求 Telefónica 使用基于英特尔 至强 可扩展处理器和英特尔 傲腾 数据中心级固态盘 的 VMware 虚拟存储区域网络 (vSAN)* 架构,完成对高 ...

  5. JDBCTemplate基本使用

    用了jdbc连接池之后,我们会发现连接对象的复用性更高了,程序整体运行的性能也更高了.但是我们在做JDBC操作的时候还是比较麻烦,要定义sql,执行sql,设置参数,处理结果. 特别是当我们要做查询操 ...

  6. 自动发布.NET Core Web应用

    1 原因和目的 相信很多开发者都需要将自己的编写的应用进行编译并部署到服务器上,这个过程在个人或小型团队的项目中都是一个简单的事情.但是对于并行化开发而言,就需要通过工具来辅助这个过程.于是,我参考了 ...

  7. cmd快捷键设置

    操作系统:windows7 x64 目的:像在任意空白处右键都有新建文档的功能一样,将cmd添加到右键里. 操作:百度经验 http://jingyan.baidu.com/article/948f5 ...

  8. Typora 配置码云图床

    目录 在码云创建一个项目作为自己床图 设置私人令牌 下载安装 PigGo Typora中设置图片上传选项 在码云创建一个项目作为自己床图 创建的项目必须为公开项目,创建的过程不细说了. 设置私人令牌 ...

  9. TopN算法,流式数据获取前N条数据

    背景:由于业务需求,用户想要统计每周,每月,几个月,一年之中的前N条数据. 根据已有的思路无非就是对全部的数据进行排序,然后取出前N条数据,可是这样的话按照目前最优的排序算法复杂度也在O(nlog(n ...

  10. Mysql权限管理以及sql数据备份

    权限管理和备份 用户管理 可视化管理 SQL命令操作 用户表:msql.user 同样就是对表的操作,就是对这张表的增删改查 -- 创建用户 create user kuangshen identfi ...