扩展属性

  • 我们发现abp的默认都会有一个ExtraProperties属性,那么他的作用是什么呢?当我们使用abp的时候,需要对其原有的表进行扩展或者添加我们想要的字段,又不想改源码,以最小的方式实现,这个时候就体现它的价值了。
  • 我们添加的数据都会在ExtraProperties以JSON对象方式进行存储。

如何添加

  • 在Domain.Shared层中提供了一个xxxModuleExtensionConfigurator类

示例

  • 给AbpUser表扩展一个用户头像地址的属性
 public static class JuiceModuleExtensionConfigurator
{
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); public static void Configure()
{
OneTimeRunner.Run(() =>
{
ConfigureExistingProperties();
ConfigureExtraProperties();
});
}
private static void ConfigureExtraProperties()
{
ObjectExtensionManager.Instance.Modules()
.ConfigureIdentity(identity =>
{
identity.ConfigureUser(user =>
{
user.AddOrUpdateProperty<string>( //property type: string
"AvatarUrl",
property =>
{
property.Attributes.Add( new StringLengthAttribute(128)); // 最大长度为28
// ...property.Attributes.Add( new RequiredAttribute()); 还有很多特性直接可以使用
}
);
});
});
}
}
  • 如何写入或者更新到数据库
private readonly IdentityUserManager _userManager;
public TestAppService(IdentityUserManager userManager)
{
_userManager = userManager;
}
public async Task AddUserAsync()
{
var user = new IdentityUser(GuidGenerator.Create(), "test-user", "test@qq.com");
user.ExtraProperties["AvatarUrl"] = "test-avatar-url";
await _userManager.CreateAsync(user);
}
  • 效果

疑问?

  • 这个数据是一个json格式保存在数据库的扩展字段的?假如我的场景是要加索引呢?这个时候这种方式就不行了?

  • 映射成数据库字段列

    • 在EntityFrameworkCore层的xxxEfCoreEntityExtensionMappings下集成一下代码
public static class JuiceEfCoreEntityExtensionMappings
{
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
public static void Configure()
{
JuiceGlobalFeatureConfigurator.Configure();
JuiceModuleExtensionConfigurator.Configure();
OneTimeRunner.Run(() =>
{
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, string>(
"AvatarUrl",
(entityBuilder, propertyBuilder) =>
{
propertyBuilder.HasMaxLength(128);
}
);
});
}
}
  • 执行ef core迁移
dotnet ef migrations addAvatarUrl
dotnet database update
  • 效果

  • 如何通过代码新增和编辑方式还是通过扩展字段操作和之前保持一致。

注意

  • AutoMapper的时候记得需要mapper扩展属性(MapExtraProperties),如下:
public class AbpIdentityApplicationModuleAutoMapperProfile : Profile
{
public AbpIdentityApplicationModuleAutoMapperProfile()
{
CreateMap<IdentityUser, IdentityUserDto>()
.MapExtraProperties(); CreateMap<IdentityRole, IdentityRoleDto>()
.MapExtraProperties();
}
}
  • 我们自写自己的模块的时候,应该也支持ExtraProperties,这样灵活性会更好。

ABP vNext Pro

Abp vNext 扩展属性的更多相关文章

  1. Abp vNext 番外篇-疑难杂症丨浅谈扩展属性与多用户设计

    说明 Abp vNext基础篇的文章还差一个单元测试模块就基本上完成了我争取10.1放假之前给大家赶稿出来,后面我们会开始进阶篇,开始拆一些东西,具体要做的事我会单独开一个文章来讲 缘起 本篇文章缘起 ...

  2. 初识ABP vNext(5):ABP扩展实体

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 扩展实体 路由整理 最后 前言 上一篇实现了前端vue部分的用户登录和菜单权限控制,但是有一些问题需要解决,比如用户头 ...

  3. [Abp vNext 源码分析] - 3. 依赖注入与拦截器

    一.简要说明 ABP vNext 框架在使用依赖注入服务的时候,是直接使用的微软提供的 Microsoft.Extensions.DependencyInjection 包.这里与原来的 ABP 框架 ...

  4. [Abp vNext 源码分析] - 2. 模块系统的变化

    一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...

  5. [Abp vNext 源码分析] - 7. 权限与验证

    一.简要说明 在上篇文章里面,我们在 ApplicationService 当中看到了权限检测代码,通过注入 IAuthorizationService 就可以实现权限检测.不过跳转到源码才发现,这个 ...

  6. ABP vNext 不使用工作单元为什么会抛出异常

    一.问题 该问题经常出现在 ABP vNext 框架当中,要复现该问题十分简单,只需要你注入一个 IRepository<T,TKey> 仓储,在任意一个地方调用 IRepository& ...

  7. [Abp vNext 源码分析] - 11. 用户的自定义参数与配置

    一.简要说明 文章信息: 基于的 ABP vNext 版本:1.0.0 创作日期:2019 年 10 月 23 日晚 更新日期:暂无 ABP vNext 针对用户可编辑的配置,提供了单独的 Volo. ...

  8. [Abp vNext 源码分析] - 5. DDD 的领域层支持(仓储、实体、值对象)

    一.简要介绍 ABP vNext 框架本身就是围绕着 DDD 理念进行设计的,所以在 DDD 里面我们能够见到的实体.仓储.值对象.领域服务,ABP vNext 框架都为我们进行了实现,这些基础设施都 ...

  9. [Abp vNext 源码分析] - 23. 二进制大对象系统(BLOB)

    一.简介 ABP vNext 在 v 2.9.x 版本当中添加了 BLOB 系统,主要用于存储大型二进制文件.ABP 抽象了一套通用的 BLOB 体系,开发人员在存储或读取二进制文件时,可以忽略具体实 ...

  10. 初识ABP vNext(1):开篇计划&基础知识

    目录 前言 开始 审计(Audit) 本地化(Localization) 事件总线(Event Bus) 多租户(multi-tenancy technology) DDD分层 实体(Entity) ...

随机推荐

  1. Oracle 11.2.0.4 Data Guard 部署练习【一主一备/单机】

    Oracle DG 理论及实验笔记 DATAGUARD 是通过建立一个 PRIMARY 和 STANDBY 组来确立其参照关系. STANDBY 一旦创建, DATAGUARD 就会通过将主数据库 ( ...

  2. 游戏引擎数学库 Plane

    0 前言 平面的表达方式有很多,常用的就两种.向量形式的点法式,标量形式的平面方程.两者可以互相转化. \[(\mathbf{p}-\mathbf{p_0})\cdot\mathbf{n}=0 \] ...

  3. 需求解决 _按需要对控件进行禁用和解除禁用 _CSS _20210922

    需求解决 _按需要对控件进行禁用和解除禁用 _CSS _20210922 通过JQuery 或者其他方式的选择器 获取DOM节点 再通过一下的方式 设置 disabled属性为 true 即可禁用,为 ...

  4. 关闭火狐Firefox下载提示弹窗

    关闭火狐 Firefox 下载提示弹窗可以通过地址栏输入about:config,打开高级首选项,搜索:browser.download.alwaysOpenPanel将true改为false即可关闭 ...

  5. Maxima 使用教程

    说起数学软件,我们很多人脑子里浮现出的第一个就是 matlab,不可否认,matlab 确实是一个优秀的数学软件,但是它需要付费啊(这里不讨论盗版问题).那么有没有一个同样强大但免费的数学软件呢?答案 ...

  6. REST API 已经 25 岁了:它是如何形成的,将来可能会怎样?

    原文:https://journal.hexmos.com/rest-turns-25/ 原题:REST APIs Turn 25: How They Came To Be and What Coul ...

  7. 贴代码框架PasteForm特性介绍之markdown和richtext

    简介 PasteForm是贴代码推出的 "新一代CRUD" ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代 ...

  8. begin-预览,不行啊还是太弱了

    方便管理,主要是想熟悉下git的操作 先创建并且切换到一个新的分支: git commit --allow-empty -am "before starting PA1" git ...

  9. javascript数组合并效率对比

    1.数组元素量级大而合并次数少时,性能对比: concat() > push() > [-array1,-array2] 2.数组元素少但合并次数多时,性能对比: push() > ...

  10. Linux之定时任务crontab

    一.cron.d增加定时任务 当我们要增加全局性的计划任务时,一种方式是直接修改/etc/crontab.但是,一般不建议这样做,/etc/cron.d目录就是为了解决这种问题而创建的. 例如,增加一 ...