扩展属性

  • 我们发现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. 防火墙NAT配置与DHCP下发

    该实验如果有做的不足的地方请见谅 实验目标: 按要求划分区域,公司内部办公区为trust,服务器区为dmz,外部网络为untrust. PC1和PC2为公司内部办公区,需要从防火墙中的DHCP服务获取 ...

  2. 开源之夏 2023|欢迎报名 Apache RocketMQ 社区项目!

    开源之夏是由中科院软件所"开源软件供应链点亮计划"发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者,促进优秀开源软件社区的蓬 ...

  3. Go语言编写单元测试用例

    Go单元测试示例 example/ |--division.go |--division_test.go 为什么被测试文件和测试文件通常放到同一个文件夹下以及同一个声明包里 通常情况下,我们把被测试的 ...

  4. Nuxt.js 应用中的 nitro:init 事件钩子详解

    title: Nuxt.js 应用中的 nitro:init 事件钩子详解 date: 2024/11/3 updated: 2024/11/3 author: cmdragon excerpt: n ...

  5. 定位模组LuatOS快速入门:源UART串口通信

    合宙Air201资产定位模组--是一个集成超低功耗4G通信.语音通话.超低功耗定位.计步.震动.Type-C.充电.放音.录音等功能的超小PCBA. 内部集成高效.简单.可靠的LuatOS语言,旨在帮 ...

  6. mysql - 修改字段名称 & 修改字段数据类型

    修改字段名称: ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>: mysql> ALTER TABLE ...

  7. java——棋牌类游戏斗地主(singleddz3.0)

    这是本人最近一段时间写的斗地主的java代码,大体框架都实现了,主要缺少,AI的智能算法. 下载地址http://download.csdn.net/detail/novelly/5695445 im ...

  8. JavaScript 样式操作

    1.类名操作 class类名以字符串的形式存储到标签和Dom元素的属性中,标签属性为class,Dom元素属性为className,两个属性是均支持读取和修改,修改其中的一个会同步至另一个属性 cla ...

  9. Mysql8忽略大小写的解决方案

    ​一.删除服务器数据文件 由于8.0没法设置参数后重启(失败),所以必须删掉老库,重新启动才行. 切记::本步骤要删掉老库所有资料,如果是数据库当前有用,请做好备份,再进行操作. systemctl ...

  10. 在 ASP.NET Core 中进行打包 (Bundling) 和紧缩 (Minification)

    在 ASP.NET Core 中进行打包 (Bundling) 和紧缩 (Minification) Bundler & Minifier for Visual Studio 2019 Bun ...