The DKNet family ships one NuGet package per capability, each with its own reference doc in the DKNet repo. This page lists only what this template actually wires up. Follow a package’s link for its full API surface.
This table is verified against the .csproj files under src/. Every DKNet package is pinned at
10.1.29 in src/Directory.Packages.props, and
tests/DKNet.Templates.ScaffoldTests/PackageArchitectureTests.cs guards those pins with four tests.
AllDKNetPackageReferences_ShouldResolveToOneRelease asserts that every DKNet.* pin resolves to the
same release, whichever release that is, so a partial bump fails the build while the pins stay in
lockstep at any single release. AllDKNetPackages_ShouldBePinnedTo_10_1_29 then asserts that release
is exactly 10.1.29, so a future bump moves all fourteen pins together and edits that one test. Two
further tests in the same file fail the build if a DKNet.* pin exists that no project references
(EveryDKNetPackageVersion_ShouldBeReferencedByAtLeastOneProject), or if any PackageReference under
src/ carries an inline Version attribute (NoPackageReference_ShouldCarryAVersionAttribute).
| Package | What it gives you | Where the template wires it | DKNet doc |
|---|---|---|---|
| DKNet.AspCore.Extensions | IEndpointConfig discovery/mapping, [FromClaim] request-member population via AddContextualRequestPopulation |
Minimal.Api/Program.cs (UseEndpointConfigs, AddContextualRequestPopulation); [FromClaim(ClaimTypes.Name)] on Minimal.AppServices/ManualSample/V1/Actions/Create.cs’s ByUser |
DKNet.AspCore.Extensions |
| DKNet.AspCore.Idempotency | Endpoint filter enforcing an idempotency key header on a route, with configurable conflict handling | .RequiredIdempotentKey() on the create route in Minimal.Api/ApiEndpoints/ManualSample/PurchaseOrderV1Endpoint.cs; AddIdempotentKey() fallback registration in Minimal.Api/Configs/AppConfig.cs — the non-generic overload is obsolete and deliberately suppressed there, used only when no Redis connection string is configured |
DKNet.AspCore.Idempotency |
| DKNet.AspCore.Idempotency.RedisStore | Redis-backed idempotency key store, used when a Redis connection string is configured | AddIdempotencyWithRedisStore(...) in Minimal.Api/Configs/AppConfig.cs, gated on ConnectionStrings:Redis |
DKNet.AspCore.Idempotency.RedisStore |
| DKNet.EfCore.Abstractions | AuditedEntity<TKey>/IAuditedProperties base audit tracking, [RaisesEvent]/[CrudCreate]/[CrudUpdate]/[SensitiveData] declarative attributes |
Minimal.Domains/Share/DomainEntity.cs extends AuditedEntity<Guid>; [RaisesEvent], [CrudCreate], [CrudUpdate], [SensitiveData] on Minimal.Domains/Features/AutomatedSample/Entities/Product.cs |
DKNet.EfCore.Abstractions |
| DKNet.EfCore.AuditLogs | ICurrentUserProvider — the name the audit-log capture asks for when stamping who changed an entity, plus structured audit-log entries beyond the four CreatedBy/CreatedOn/UpdatedBy/UpdatedOn fields |
Minimal.AppServices/Share/IPrincipalProvider.cs extends ICurrentUserProvider; implemented by GetCurrentUser() in Minimal.Api/Configs/Handlers/PrincipalProvider.cs |
DKNet.EfCore.AuditLogs |
| DKNet.EfCore.DataAuthorization | IDataOwnerProvider/IDataOwnerDbContext, the DataOwnerHook that stamps the OwnedBy ownership key on save |
Minimal.AppServices/Share/IPrincipalProvider.cs implements IDataOwnerProvider; .AddDataOwnerProvider<CoreDbContext, PrincipalProvider>() in Minimal.Api/Configs/ServiceConfigs.cs; Minimal.Infra/Contexts/CoreDbContext.cs implements IDataOwnerDbContext. See auditing-and-data-ownership.md for the full save-pipeline story. |
DKNet.EfCore.DataAuthorization |
| DKNet.EfCore.DtoGenerator | Source-generates a DTO record from [GenerateDto(typeof(Entity))], mapped automatically |
[GenerateDto(typeof(Product))] on Minimal.AppServices/AutomatedSample/V1/ProductDto.cs |
DKNet.EfCore.DtoGenerator |
| DKNet.EfCore.Events | AddEventPublisher<TDbContext, TPublisher>() — publishes domain events raised on aggregates during SaveChanges |
.AddEventPublisher<CoreDbContext, EventPublisher>() in Minimal.Infra/Extensions/InfraSetup.cs |
DKNet.EfCore.Events |
| DKNet.EfCore.Extensions | UseAutoConfigModel / UseAutoDataSeeding — assembly-scan discovery of IEntityTypeConfiguration<T> mappers and IDataSeedingConfiguration<T> seeders, so no manual DbSet or seeding registration is needed |
.UseAutoConfigModel(...) + .UseAutoDataSeeding(...) in both Minimal.Infra/Extensions/InfraSetup.cs and Minimal.Infra/Extensions/InfraMigration.cs; seeding configuration types imported via Minimal.Infra/GlobalUsings.cs; UseRoleAwareSensitiveData(...) opts the minimal-API JsonSerializerOptions into role-gated [SensitiveData] response filtering in Minimal.Api/Configs/ServiceConfigs.cs, with the ISensitiveDataPrincipalAccessor implementation in Minimal.Api/Configs/Handlers/HttpContextSensitiveDataPrincipalAccessor.cs — see api-pipeline.md |
DKNet.EfCore.Extensions |
| DKNet.EfCore.Relational.Helpers | DbContextHelpers — table-existence checks, raw connection access, schema/table-name lookup |
Referenced by Minimal.Infra.csproj; no call site in the checked-in template source today — it’s a ready import for developer code that needs those helpers |
DKNet.EfCore.Relational.Helpers |
| DKNet.EfCore.Specifications | Specification<T>, IRepositorySpec, keyset paging — composable query filters over a repository |
.AddSpecRepo<CoreDbContext>() in Minimal.Infra/Extensions/InfraSetup.cs; Minimal.AppServices/ManualSample/V1/Specs/SpecGetPurchaseOrder.cs extends Specification<PurchaseOrder>; IRepositorySpec used throughout Minimal.AppServices/ManualSample/V1/Actions/ |
DKNet.EfCore.Specifications |
| DKNet.Fw.Extensions | Core framework helpers, including the TypeExtractors fluent assembly-scanning API (.Extract().Classes().NotAbstract()...) |
Minimal.AppServices/Extensions/MapsToExtensions.cs uses DKNet.Fw.Extensions.TypeExtractors to discover [MapsFrom]/[GenerateDto] DTO types and register their Mapster configs |
DKNet.Fw.Extensions |
| DKNet.SlimBus.Extensions | Fluents.Requests/Fluents.Queries interfaces for SlimMessageBus handlers, AddSlimBusEfCoreInterceptor<TDbContext>() |
.AddSlimBusEfCoreInterceptor<CoreDbContext>() in Minimal.Infra/Extensions/ServiceBusSetup.cs; Fluents.Requests.IWitResponse<T>/IHandler implemented across Minimal.AppServices/ManualSample/V1/Actions/ and Minimal.AppServices/AutomatedSample/V1/ |
DKNet.SlimBus.Extensions |
| DKNet.SlimBus.Generators | Roslyn source generator: from [CrudCreate]/[CrudUpdate] on an entity plus its [GenerateDto] DTO, emits the request records, handlers, and a Map{Entity}Crud() endpoint-mapping extension for a full CRUD slice |
Analyzer-only reference on Minimal.AppServices.csproj; triggered by [CrudCreate]/[CrudUpdate] on Minimal.Domains/Features/AutomatedSample/Entities/Product.cs plus [GenerateDto(typeof(Product))] on Minimal.AppServices/AutomatedSample/V1/ProductDto.cs; the generated MapProductCrud() is called from Minimal.Api/ApiEndpoints/AutomatedSample/ProductV1Endpoint.cs, which passes it per-route options and one by-name exclusion, then hand-maps the two routes the generator cannot express below it — no hand-written request or handler exists for any generated route |
DKNet.SlimBus.Generators |
The rest of the DKNet family a developer may want to add later. None of these are referenced by any
.csproj in this template — add the package yourself before using them.
| Package | What it gives you | DKNet doc |
|---|---|---|
| DKNet.Svc.BlobStorage.Abstractions (+ .AzureStorage / .AwsS3 / .Local) | Provider-agnostic blob storage abstraction with swappable backends | DKNet.Svc.BlobStorage.Abstractions |
| DKNet.EfCore.Encryption | Transparent column-level encryption through an EF Core value converter | DKNet.EfCore.Encryption |
| DKNet.EfCore.Hooks | The before/after-SaveChanges interceptor pipeline the Events and DataAuthorization packages register against. Pulled in transitively today — reference it directly only to register a hook of your own |
DKNet.EfCore.Hooks |
| DKNet.Svc.Encryption | Symmetric/asymmetric encryption helpers for sensitive field values | DKNet.Svc.Encryption |
| DKNet.Svc.PdfGenerators | PDF document generation | DKNet.Svc.PdfGenerators |
| DKNet.Svc.Transformation | Data transformation pipelines | DKNet.Svc.Transformation |
| DKNet.RandomCreator | Deterministic/seedable random value generation for tests and seeding | DKNet.RandomCreator |
| DKNet.AspCore.Tasks | Background task scheduling | DKNet.AspCore.Tasks |
| DKNet.AspCore.Idempotency.MsSqlStore / .NpgsqlStore / .Relational | Idempotency key stores on a SQL database instead of Redis — an alternative to the Redis store this template wires by default. .NpgsqlStore is the one that matches this template’s provider |
DKNet.AspCore.Idempotency.Relational |
Aspire.Hosting.ServiceBus — in DKNet, but not on NuGetDKNet also carries an Aspire.Hosting.ServiceBus project: an Aspire resource that runs the Azure
Service Bus emulator locally, so the AzureBus child bus can be exercised without a real namespace.
It is not published — src/Aspire/Aspire.Hosting.ServiceBus/Aspire.Hosting.ServiceBus.csproj
sets <IsPackable>false</IsPackable>, so dotnet add package Aspire.Hosting.ServiceBus cannot
resolve. The only way to use it is a ProjectReference from Minimal.AppHost to that project in a
local DKNet clone. DKNet’s
Aspire.Hosting.ServiceBus
describes the resource itself.
DKNet.EfCore.Repos and DKNet.EfCore.Repos.Abstractions are retired and never published to
NuGet — both projects set <IsPackable>false</IsPackable> and every public type carries
[Obsolete]. This template has never referenced them, and new code should not: IRepositorySpec
from DKNet.EfCore.Specifications is the supported way to query and persist. DKNet’s own
Migrating-Repos-To-Specifications
covers the call-site mapping if you are porting older code into a scaffolded solution.