abp vnext 开发快速入门 2 实现基本增删改查
上篇说了abp vnext 的大体框架结构,本篇说下如何实现基础的增删改查。实现增删改查有以下几个步骤:
1、配置数据库连接
2、领域层(Domain)创建实体,Ef core 层配置Dbset( 用的Ef core code first) ,自动创建数据库和表
3、ApplicationContract 层编写Dto(数据传输对象)
4、Application 层设置AutoMap, 编写增删改查方法
5、运行宿主服务,这里用到了swagger,用swagger 进行测试。
我就一个一个步骤挨着说一下,首先第一个
1、配置数据库连接,找到宿主服务,上篇说道是.HttpApi.Host,这个项目下有个appsettings.json,这个文档里找到ConnectionStrings,默认生成的Default 和项目名相关的一个连接。主要是把项目名相关的这个数据库连接改成真实的,Default那个看心情改,目前没发现有什么用还。比如
"ConnectionStrings": { "Default": "Server=.;Database=SoftwarePortal_Main;User ID=sa;Password=123456;", "Test": "Server=.;Database=SoftwarePortal_Module;User ID=sa;Password=123456;" },
2、领域层创建实体
到Domain层创建要用到的实体。这块跟普通的netcore 差不多了,直接列代码,我这个代码是项目中的用到的 “类别”的实体。
[Table("Categories")] public class Category : FullAuditedEntity<Guid> { /// <summary> /// 类别名称 /// </summary> [MaxLength(50), Required] public string CategoryName { get; set; } /// <summary> /// 父级 /// </summary> [Required] public Guid ParentID { get; set; } /// <summary> /// 排序 /// </summary> [Required] public int Sort { get; set; } /// <summary> /// 属性列表 /// </summary> public IList<AttributeInfo> AttributeInfoList { get; set; } /// <summary> /// 属性组列表 /// </summary> public IList<AttributeGroup> AttributeGroupList { get; set; } }
以上可以发现继承了FullAuditedEntity<Guid>,之所以这样是因为可以用到abp框架里的自带的比如ID , IsDeleted,DeleterId,DeletionTime 等等这些,而且继承这个看文档说的用框架做删除操作。默认的不是真实删除,而是逻辑删除。
编写好实体后,Ef core 层写DbSet,主要在两个地方:
在DbContext类加上
public DbSet<Category> Categories { get; set; }
在DbContextModelCreatingExtensions类加上
builder.Entity<Category>();
加完这些就可以运行自动创建或更新数据库的命令了。
3、ApplicationContract 层 添加Dto,Dto是数据传输对象。这个应该很多人不陌生,就是用来接收前端传过来的数据或者把后端产生的数据转为前端能看的数据。可以通过Automap与后端数据进行数据转换。这里举例接收创建一个Category数据的Dto
public class CreateCategoryDto { /// <summary> /// 类别名称 /// </summary> [MaxLength(50, ErrorMessage = "名称最长50"), Required(ErrorMessage = "名称必填")] public string CategoryName { get; set; } /// <summary> /// 父级 /// </summary> [Required(ErrorMessage = "上级必填")] public Guid ParentID { get; set; } /// <summary> /// 排序 /// </summary> [Required(ErrorMessage = "排序必填")] public int Sort { get; set; } }
通过这个Dto,可以实现数据接收,也能自动实现数据校验
4、编写好Dto后,在Application层下的AutomapperProfile文件里编写
CreateMap<CreateCategoryDto, Category>(MemberList.Source);
做下映射。
然后Application层下创建一个CategoryAppService 的类(这个类继承ApplicationService,否则无法直接用ObjectMapper),里边放关于Category的一系列操作的方法。比如创建操作方法
/// <summary> /// 创建类别 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<ApiResponse> CreateAsync(CreateCategoryDto input) { var category = ObjectMapper.Map<CreateCategoryDto, Category>(input); var categoryAdd = await _categoryRepository.InsertAsync(category); return new ApiResponse("创建成功", ObjectMapper.Map<Category, CategoryDto>(categoryAdd),SoftwarePortalErrorCodes.Success); }
其中 _categoryRepository 是这样声明的,利用了abp vnext自带的仓储
private readonly IRepository<Category, Guid> _categoryRepository; public CategoryAppService(IRepository<Category, Guid> repository) { _categoryRepository = repository; }
编写后呢就可以运行宿主服务测试刚刚创建好的这个服务了。