JavaScript is required
Back

Abp vNext 扩展属性

2024/12/31

Abp vNext 扩展属性

扩展属性

  • 我们发现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




转载声明
本文内容出自网络,非原创作品。由于无法确认原始来源和作者信息,在此对原作者表示感谢。
如涉及版权问题,请联系 [联系邮箱],我们将及时处理。