基于abp vnext手动编写一个功能的完整步骤
本文忽略对abp vnext框架及DDD软件开发方法的解析,直入主题,讲解一个功能实现中各层代码的实现,步骤如下:
1、下载模块框架代码
通过使用 abp cli或者直接通过官方进行下载,如下图:
2、领域层定义
领域层划分为两个项目:
- Domain.Shared 包(项目) 命名为CompanyName.ModuleName.Domain.Shared,包含常量,枚举和其他类型, 它不能包含实体,存储库,域服务或任何其他业务对象. 可以安全地与模块中的所有层使用. 此包也可以与第三方客户端使用.
- Domain 包(项目) 命名为CompanyName.ModuleName.Domain, 包含实体, 仓储接口,领域服务接口及其实现和其他领域对象.
- Domain 包依赖于 Domain.Shared 包.
1)实体定义
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;namespace demo1.Articles
{/// <summary>/// 文章/// </summary>public class Article : CreationAuditedEntity<Guid>, IMultiTenant{/// <summary>/// 租户Id/// </summary>public Guid? TenantId { get; private set; }/// <summary>/// 标题/// </summary>/// <returns></returns>[Required][MaxLength(100)]public string Title { get; set; }/// <summary>/// 副标题/// </summary>/// <returns></returns>[MaxLength(100)]public string SubTitle { get; set; }/// <summary>/// 作者/// </summary>/// <returns></returns>[MaxLength(50)]public string Aauthor { get; set; }/// <summary>/// 内容/// </summary>/// <returns></returns>[Required]public string Content { get; set; }/// <summary>/// 来源/// </summary>public string Source { get; set; }}
}
2)仓储接口
一般存放在与实体定义在同一个文件夹下,命名约定为:I{实体名}Repositor,如:IArticleRepository。
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using Volo.Abp.Domain.Repositories;namespace demo1.Articles
{/// <summary>/// 文章 仓储接口/// </summary>public interface IArticleRepository : IRepository<Article, Guid>{Task<List<Article>> GetListAsync(bool paged = true,string sorting = null,int maxResultCount = int.MaxValue,int skipCount = 0,string filter = null,CancellationToken cancellationToken = default);Task<long> GetCountAsync(string filter = null,CancellationToken cancellationToken = default);}
}
3、基础设施层的代码变动
- 推荐 为每个orm/数据库集成创建一个独立的集成包, 比如Entity Framework Core 和 MongoDB.
- 推荐 例如, 创建一个抽象Entity Framework Core集成的CompanyName.ModuleName.EntityFrameworkCore 包. ORM 集成包依赖于 Domain 包.
- 不推荐 依赖于orm/数据库集成包中的其他层.
- 推荐 为每个主要的库创建一个独立的集成包, 在不影响其他包的情况下可以被另一个库替换.
using demo1.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;namespace demo1.Articles
{public class ArticleRepository : EfCoreRepository<Idemo1DbContext, Article, Guid>, IArticleRepository{public ArticleRepository(IDbContextProvider<Idemo1DbContext> dbContextProvider) : base(dbContextProvider){}public virtual async Task<List<Article>> GetListAsync(bool paged = true,string sorting = null,int maxResultCount = int.MaxValue,int skipCount = 0,string filter = null,CancellationToken cancellationToken = default){var query = (await GetDbSetAsync()).WhereIf(!filter.IsNullOrWhiteSpace(),u => u.Title.Contains(filter)).OrderBy(sorting.IsNullOrWhiteSpace() ? "CreationTime desc" : sorting);if (paged){return await query.PageBy(skipCount, maxResultCount).ToListAsync(GetCancellationToken(cancellationToken));}else{return await query.ToListAsync(GetCancellationToken(cancellationToken));}}public virtual async Task<long> GetCountAsync(string filter = null,CancellationToken cancellationToken = default){return await (await GetDbSetAsync()).WhereIf(!filter.IsNullOrWhiteSpace(),u => u.Title.Contains(filter)).LongCountAsync(GetCancellationToken(cancellationToken));}}
}
4、应用服务层的代码变动
将应用服务层划分为两个项目:
- Application.Contracts 包(项目) 命名为*CompanyName.ModuleName.Application.Contracts,包含应用服务接口和相关的数据传输对象(DTO).
- Application contract 包依赖于 Domain.Shared 包.
- Application 包(项目)命名为CompanyName.ModuleName.Application,包含应用服务实现.
- Application 包依赖于 Domain 包和 Application.Contracts 包.
5、数据库迁移
使用add-migration 和Update-Database进行数据库迁移。
总结:每个领域功能的开发流程大致如此。
基于abp vnext手动编写一个功能的完整步骤相关推荐
- 阿星Plus:基于abp vNext开源一个博客网站
作为微软最早迈向开源的重要软件之一,.NET 5的发布具有重要意义! 微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上,为明年发布的 .NET 6.0 将 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目
基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 转载于:https://github.com/Meowv/Blog 首先,默认咱们已经有了.net ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)
基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三) 转载于:https://github.com/Meowv/Blog 上一篇完成了博客的主题切换,菜单和 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三)
基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三) 转载于:https://github.com/Meowv/Blog 本篇继续围绕抓取完成后的操作做一个提醒. ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场
基于 abp vNext 和 .NET Core 开发博客项目 - 完善与美化,Swagger登场 转载于:https://github.com/Meowv/Blog.git 在程序员界,总有一批强迫 ...
- 在 ABP vNext 中编写仓储单元测试的问题一则
一.问题 新项目是基于 ABP vNext 框架进行开发的,所以我要求为每层编写单元测试.在同事为某个仓储编写单元测试的时候,发现了一个奇怪的问题.他的对某个聚合根的 A 字段进行了更新,随后对某个导 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九)
基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(九) 转载于:https://github.com/Meowv/Blog 终于要接近尾声了,上一篇基本上将文 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八)
基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(八) 转载于:https://github.com/Meowv/Blog 上一篇完成了标签模块和友情链接模块 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六)
基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(六) 转载于:https://github.com/Meowv/Blog 上一篇完成了博客文章详情页面的数据 ...
最新文章
- HTTP状态码对照表(全部状态_建议收藏)
- md /mdd /ml /mt/mtd
- 11月12号 用户登录输入密码错误达到指定次数后,锁定账户 004
- html图片分四面切割播,CSS3切割轮播图
- c++读取.dat文件_Python之旅,Day5 - 文件操作
- linux搜索命令有哪些,linux五大搜索命令学习
- 体重 年龄 性别 身高 预测鞋码_计算体重指数时,需要以下()数据。A.性别B.年龄C.身高D.体重...
- 数据驱动在链家网搜索优化与推荐策略中的实践
- 微型计算机外文文献,单片机外文文献翻译---微型计算机控制系统
- oracle ocp认证指南,OCP认证考试指南(三):创建Oracle数据库
- 批量生成独一无二的NFT猫猫图,这项目王多鱼会投吗?
- Houdini 求中点,点连成线
- 【C语言】一文带你简单了解C语言
- 华三 h3c isis协议综合配置
- Python小学生课程学哪些内容?
- php 新手二维码生成
- 四种人适合一起创业,三种人绝对不能合伙
- controll层跳转页面_js 控制页面跳转的5种方法
- 关于神经网络训练的一些技巧NN Tricks
- 【CenterNet】模型文件resnet101-5d3b4d8f.pth下载