Dignite.Abp.FlexFields.FileExplorer 10.0.0-rc.16

This is a prerelease version of Dignite.Abp.FlexFields.FileExplorer.
dotnet add package Dignite.Abp.FlexFields.FileExplorer --version 10.0.0-rc.16
                    
NuGet\Install-Package Dignite.Abp.FlexFields.FileExplorer -Version 10.0.0-rc.16
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Dignite.Abp.FlexFields.FileExplorer" Version="10.0.0-rc.16" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Dignite.Abp.FlexFields.FileExplorer" Version="10.0.0-rc.16" />
                    
Directory.Packages.props
<PackageReference Include="Dignite.Abp.FlexFields.FileExplorer" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Dignite.Abp.FlexFields.FileExplorer --version 10.0.0-rc.16
                    
#r "nuget: Dignite.Abp.FlexFields.FileExplorer, 10.0.0-rc.16"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Dignite.Abp.FlexFields.FileExplorer@10.0.0-rc.16
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Dignite.Abp.FlexFields.FileExplorer&version=10.0.0-rc.16&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Dignite.Abp.FlexFields.FileExplorer&version=10.0.0-rc.16&prerelease
                    
Install as a Cake Tool

Dignite.Abp.FlexFields

Part of dignite-projects/abp-modules — see the repository README for the other modules, and CONTRIBUTING.md for the build, versioning, and release process shared across them.

A constraint kernel for adding flexible, per-instance fields (EAV) to any host entity in an ABP Framework solution — modeled on ABP's own Volo.Abp.Users: contracts, generics, and mechanism only, no field or host model of its own. Every downstream (a CMS, a commerce catalog, …) owns its own field-definition entity, host entity, and database table; the kernel never defines "the concrete one."

  • A self-built value bag, not ExtraProperties. IHasFlexFields.FlexFields is FlexFields' own dictionary, isolated from ABP's shared ExtraProperties bag by design (see docs/flexfields-design.md §4).
  • One seam in, one seam out. A downstream implements IFlexFieldProvider<TEntity> to tell the kernel what fields a host entity has; the kernel gives back validation (IFlexFieldValidator<TEntity>), a query pushdown (IFlexFieldQueryExecutor<TEntity>), derived-index maintenance (IFlexFieldIndexManager<TEntity>), and value-bag key migration for renamed or deleted field definitions (IFlexFieldValueMigrator<TEntity>).
  • Provider-agnostic by design. The relational pivot-table shape (FlexFieldIndexValue, EfCoreFlexFieldIndexManagerBase, …) lives only in Dignite.Abp.FlexFields.EntityFrameworkCore; the MongoDB provider has no equivalent type and queries the value bag directly.

.NET 10 · ABP 10.5.0 · LGPL-3.0-only

Packages

Package Purpose
Dignite.Abp.FlexFields.Domain.Shared Shared constants (FlexFieldConsts). Dependency-free.
Dignite.Abp.FlexFields.Abstractions DDD-free contracts and vocabulary: IFlexFieldData/FlexFieldData, IHasFlexFields/FlexFieldDictionary, FlexFieldValue, IFieldType + the built-in field types (Text/Number/DateTime/Select/Boolean/Tree, plus the composite Matrix/Table and their ICompositeFieldType/INormalizesValue/InlineFieldDefinition/CompositeFieldNesting contracts), the query vocabulary, and the field-lifecycle Etos (FlexFieldRenamedEto, FlexFieldDeletedEto). Referencing this package alone is enough to implement a custom field type or type a downstream's DTOs.
Dignite.Abp.FlexFields.Domain The Entity contract (IFlexField : IAggregateRoot<Guid>) and the DDD-aware seams: IFlexFieldProvider<TEntity>, IFlexFieldValidator<TEntity> (+ default impl), IFlexFieldIndexManager<TEntity>, IFlexFieldQueryExecutor<TEntity>, IFlexFieldValueMigrator<TEntity> (+ its one provider-agnostic default impl), IFlexFieldRepository<TField>.
Dignite.Abp.FlexFields.EntityFrameworkCore EF Core support (not ownership): ConfigureFlexFieldsProperty/ConfigureFlexField/ConfigureFlexFieldIndex model-builder extensions, the typed pivot-row shape (FlexFieldIndexValue), and abstract base classes for the index manager, query executor, and field repository. Ships no DbContext and no table of its own.
Dignite.Abp.FlexFields.MongoDB MongoDB support: queries and indexes the FlexFieldDictionary in place, so writes need almost no index synchronization. Deliberately has no counterpart to FlexFieldIndexValue — that shape is a relational pivot row.
@dignite/ng.flex-fields (npm) Angular UI: config / control / view / search components for all eight field types, the FieldTypeResolver registry, and provideFlexFields(). See angular/projects/flex-fields.

Install

Add the layers a downstream project needs — a domain project typically needs Domain (which pulls in Domain.Shared and Abstractions transitively), and an EF Core persistence project adds EntityFrameworkCore:

dotnet add path/to/MyProject.Domain.csproj package Dignite.Abp.FlexFields.Domain --version 10.0.0-rc.4
dotnet add path/to/MyProject.EntityFrameworkCore.csproj package Dignite.Abp.FlexFields.EntityFrameworkCore --version 10.0.0-rc.4

A project that only needs the field-type vocabulary (for example, a shared DTO project) can reference Dignite.Abp.FlexFields.Abstractions alone.

Implementing the seam

A downstream owns its own field-definition entity, host entity, and IFlexFieldProvider<TEntity>:

public class Field : AggregateRoot<Guid>, IFlexField { /* Name, DisplayName, FieldTypeName, ... */ }

public class Entry : AggregateRoot<Guid>, IHasFlexFields
{
    public virtual FlexFieldDictionary FlexFields { get; set; } = new();
}

public class EntryFlexFieldProvider : IFlexFieldProvider<Entry>
{
    // Merge this host's field definitions + per-usage Required/Searchable + entity.FlexFields
    // into FlexFieldValue instances - the kernel's only way to learn what fields Entry has.
}

The EF Core project maps the value bag, the field definition, and a per-host index table onto the downstream's own DbContext:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Entity<Entry>(b => b.ConfigureFlexFieldsProperty<Entry>());
    builder.Entity<Field>(b => b.ConfigureFlexField<Field>());
    builder.Entity<EntryFlexFieldIndex>(b => b.ConfigureFlexFieldIndex<EntryFlexFieldIndex>());
}

See docs/flexfields-design.md for the full design rationale. For a worked example, demo/ is the same seam wired to a real, runnable feature (Product/ProductField, an Angular admin UI, seeded data) — run it with dotnet run --project demo/Dignite.Abp.FlexFields.Demo -- --migrate-database followed by dotnet run --project demo/Dignite.Abp.FlexFields.Demo and cd angular && npm start. The Dignite.Abp.FlexFields.EntityFrameworkCore.Tests project (TestField, TestArticle, TestArticleFlexFieldProvider, …) is the same shape distilled to its minimum, without a UI.

Renaming or deleting a field definition

A field definition's Name is the key its values are stored under in every host entity's bag, so renaming or deleting one is a data migration, not a simple edit. IFlexFieldValueMigrator<TEntity> — one provider-agnostic implementation, resolved for any host type with no downstream code required — handles it:

// after ruling out a duplicate with IFlexFieldRepository<TField>.NameExistsAsync(newName, excludedId)
// and changing the definition's own Name:
await migrator.RenameFieldAsync(oldName: "AuthorName", newName: "Author");

FlexFieldRenamedEto / FlexFieldDeletedEto in .Abstractions exist for downstreams whose field definitions and host entities live in different modules; the kernel neither publishes nor handles them. See the XML docs on IFlexFieldValueMigrator<TEntity> for the required ordering.

Build & test

The library projects build through the repository's aggregate solution (Dignite.Abp.FlexFields.slnx covers the demo host only):

dotnet build Dignite.Abp.Modules.slnx
dotnet test  flex-fields/test/Dignite.Abp.FlexFields.Tests
dotnet test  flex-fields/test/Dignite.Abp.FlexFields.EntityFrameworkCore.Tests
dotnet test  flex-fields/test/Dignite.Abp.FlexFields.MongoDB.Tests

# Pack for local testing (version / license come from the repository root Directory.Build.props)
dotnet pack Dignite.Abp.Modules.slnx -c Release

The Angular library is an npm workspace, outside MSBuild:

cd flex-fields/angular && npm install --legacy-peer-deps && npm run build:lib

--legacy-peer-deps is required: @abp/ng.theme.shared depends on @swimlane/ngx-datatable, whose Angular peer range stops at 20, so npm will not hoist it beside Angular 21 without it.

Run the demo stack — the host on https://localhost:44330, the Angular app on http://localhost:4200:

dotnet run --project flex-fields/demo/Dignite.Abp.FlexFields.Demo

Repository layout

src/Dignite.Abp.FlexFields.Domain.Shared        shared constants
src/Dignite.Abp.FlexFields.Abstractions         DDD-free contracts, field types, Etos
src/Dignite.Abp.FlexFields.Domain               Entity contract + DDD-aware seams
src/Dignite.Abp.FlexFields.EntityFrameworkCore  EF Core support (no DbContext, no table)
src/Dignite.Abp.FlexFields.MongoDB              MongoDB support (no pivot table)
test/                                           per-layer test projects
angular/projects/flex-fields                    publishable Angular library (@dignite/ng.flex-fields)
angular/src                                     Angular demo app - local dev only, never published
demo/                                           demo ABP host - local dev only, never packed
docs/flexfields-design.md                       design rationale

License

Licensed under LGPL-3.0-only.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Dignite.Abp.FlexFields.FileExplorer:

Package Downloads
Dignite.Abp.FlexFields.FileExplorer.Web

Default <flex-field-view> rendering (Dignite.Abp.FlexFields.Web) for the FileExplorer bolt-on field type: file name, size, MIME type and a link, read straight out of the value the Angular picker already denormalized at pick time (id/containerName/blobName/name/mimeType/size/url - see FileExplorerFieldType's own doc comment). Zero IO and zero reference to Dignite.FileExplorer, the same boundary the field type itself keeps - the stored value already carries everything this view needs. No search partial: FileExplorerFieldType.IndexValueType is null, so there is nothing to search on.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
10.0.0-rc.16 69 9/6/2026
10.0.0-rc.15 66 9/5/2026
10.0.0-rc.14 67 9/4/2026
10.0.0-rc.13 63 9/3/2026
10.0.0-rc.11 67 8/30/2026
10.0.0-rc.7 65 8/30/2026
10.0.0-rc.6 61 8/30/2026