AstraFlow.Testing 1.6.2

dotnet add package AstraFlow.Testing --version 1.6.2
                    
NuGet\Install-Package AstraFlow.Testing -Version 1.6.2
                    
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="AstraFlow.Testing" Version="1.6.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AstraFlow.Testing" Version="1.6.2" />
                    
Directory.Packages.props
<PackageReference Include="AstraFlow.Testing" />
                    
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 AstraFlow.Testing --version 1.6.2
                    
#r "nuget: AstraFlow.Testing, 1.6.2"
                    
#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 AstraFlow.Testing@1.6.2
                    
#: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=AstraFlow.Testing&version=1.6.2
                    
Install as a Cake Addin
#tool nuget:?package=AstraFlow.Testing&version=1.6.2
                    
Install as a Cake Tool

AstraFlow

AstraFlow package icon

AstraFlow is a MIT-licensed .NET package family for explicit CQRS dispatch and source-auditable object mapping.

It was built to keep production applications free from runtime license checks, hidden mapping behavior, and framework lock-in. The v1 design is deliberately small: secure defaults, clear errors, explicit extension points, and package-quality diagnostics before optional convention layers are added.

NuGet shows package history under the Release Notes tab. GitHub shows only selected community files as repository tabs, so the README is the main public hub for everything else.

Link What It Shows
Release Notes / Changelog Full release-by-release package history.
GitHub Releases Tagged releases and downloadable source archives.
Security Policy Supported versions and vulnerability reporting.
Contributing Local development, tests, and contribution rules.
Code of Conduct Expected community behavior.
Support Where to ask usage questions or report package issues.
Buy Me a Coffee Optional support for ongoing maintenance.
Roadmap Planned mediator, mapper, testing, analyzer, generator, and ecosystem work.
Publishing Guide Release and NuGet publishing process.
MIT License Package license.

Packages

Package Purpose
AstraFlow.Contracts Shared mediator contracts for requests, notifications, streams, senders, publishers, processors, and exception flow.
AstraFlow.Mediator Request/response dispatch, void commands, stream requests, notification publishing, pipeline behaviors, processors, exception flow, handler scanning, duplicate handler detection, and optional handler coverage validation.
AstraFlow.Mapper Explicit object mapping rules, declared mapping catalogs, startup validation, collection mapping, named projection registry, projection validation, and secure ID mapping abstractions.
AstraFlow.Mapper.Conventions Optional convention mapping with exact pair registration, profiles, strict mapping plans, flattening, explicit reverse mapping, inheritance, polymorphic dispatch, custom paths, resolvers, value transformers, hooks, and sensitive-field safeguards.
AstraFlow.Mapper.EntityFrameworkCore Optional EF Core projection translation validation helpers for registered AstraFlow projections.
AstraFlow.Diagnostics Framework-neutral diagnostics reports for AstraFlow registrations, findings, JSON output, Markdown output, and health-check-ready summaries.
AstraFlow.Testing Framework-neutral test helpers for fake mediator flows, handler harnesses, mapper/projection assertions, diagnostics assertions, and test secure IDs.
AstraFlow Convenience package referencing both mediator and mapper with one registration method.

Documentation Map

Document Read When
Getting Started You want the shortest path from install to working mediator and mapper usage.
Package Selection You want to choose the smallest package set for an app, library, test project, or EF Core project.
Compatibility You want current target framework support and target-expansion rules.
API Reference You need every public type, method, option, and expected behavior in one table-driven reference.
Architecture You want to understand the package design, runtime flow, dependency boundaries, and non-goals.
Mediator Guide You are using requests, handlers, notifications, or pipeline behaviors.
Mediator Scenarios You want expected behavior for success cases, missing handlers, duplicate handlers, ambiguous requests, pipeline order, and notification failures.
Mapper Guide You are writing mapping rules, projections, validation, or secure ID mapping.
Convention Mapping You want opt-in convention mapping with visible mapping plans and sensitive-field safeguards.
Mapper Scenarios You want expected behavior for object mapping, nulls, collections, validation failures, projections, and secure IDs.
Projection Guide You are registering, naming, validating, or resolving explicit projections.
Projection Scenarios You want expected behavior for duplicate, missing, named, risky, and strict projection cases.
EF Core Guide You want optional EF Core projection translation checks.
Diagnostics Guide You want JSON or Markdown reports of handlers, behaviors, mappings, projections, and diagnostics findings.
Testing Guide You want fake sender/publisher/mediator helpers, handler harnesses, and assertion helpers for tests.
Troubleshooting You hit an exception and want the likely cause and fix.
Community Release Guide You are preparing the repo push, tag, package verification, and community-facing release notes.
Roadmap You want the completed v1.2 projection safety scope and the future testing, mediator-parity, mapping-parity, analyzer, generator, and ecosystem roadmap.
Future Ideas Bank You want the broader candidate backlog for future features, integrations, platform tooling, and research ideas.
Changelog You want the release-by-release history shown in GitHub and linked from the NuGet README.
Publishing You are preparing or verifying a NuGet release.

Target Framework

Since 1.4.0, AstraFlow.Contracts, AstraFlow, AstraFlow.Mediator, AstraFlow.Mapper, AstraFlow.Diagnostics, and AstraFlow.Testing ship netstandard2.0, net8.0, net9.0, and net10.0 assets. Since 1.5.0, AstraFlow.Mapper.Conventions ships the same non-EF targets. AstraFlow.Mapper.EntityFrameworkCore remains net10.0 because it follows the EF Core 10 package line.

Public API At A Glance

Registration

API Package Use It For Expected Result
services.AddAstraFlowMediator(params Type[] assemblyMarkerTypes) AstraFlow.Mediator Register mediator services and scan marker assemblies without request coverage validation. IMediator, ISender, IPublisher, request handlers, and notification handlers are available from DI.
services.AddAstraFlowMediator(bool validateRequestCoverage, params Type[] assemblyMarkerTypes) AstraFlow.Mediator Register mediator services and optionally fail startup when scanned requests have no handler or ambiguous contracts. Same registration as above, with extra validation when enabled.
services.AddAstraFlowMediator(builder => ..., params Type[] assemblyMarkerTypes) AstraFlow.Mediator Register mediator services and add explicit behaviors, processors, stream behaviors, and exception-flow components. Core handlers are scanned and cross-cutting components are registered in a readable place.
services.AddAstraFlowMapper(params Type[] assemblyMarkerTypes) AstraFlow.Mapper Register mapper services and scan marker assemblies for mapping rules and projections. IMapper, IObjectMappingValidator, IProjectionRegistry, IProjectionValidator, SecureIdMapper, and startup validation are registered.
services.AddAstraFlowMapper(IEnumerable<Type>, Action<MappingOptions>?) AstraFlow.Mapper Register mapper services with explicit mapper/projection validation options. Mapping and projection validation behavior is configured without adding new overloads for every option.
services.AddAstraFlowConventionMapping(...) AstraFlow.Mapper.Conventions Register exact opt-in convention mapping pairs, profiles, and strict mapping-plan validation. Convention mapping rules and IMappingPlanProvider are registered without changing explicit mapper defaults.
services.AddAstraFlowDiagnostics(Action<AstraFlowDiagnosticsOptions>?) AstraFlow.Diagnostics Register diagnostics after mediator/mapper services so it can snapshot registrations. IAstraFlowDiagnosticsReporter can create in-memory, JSON, and Markdown reports.
services.AddAstraFlow(bool validateRequestCoverage = false, params Type[] assemblyMarkerTypes) AstraFlow Register mediator and mapper together. Combined setup for applications that intentionally use both packages.

Mediator

API Use It For Expected Result
IRequest Mark a command/request that completes without a response value. The request can be sent through ISender.Send(IRequest) or runtime Send(object) if exactly one void handler exists.
IRequest<TResponse> Mark a request/command/query and declare its response type. The request can be sent through ISender if exactly one matching handler exists.
IRequestHandler<TRequest>.Handle(...) Implement void request handling. The handler completes without returning an application value.
IRequestHandler<TRequest, TResponse>.Handle(...) Implement request handling. The handler produces the response for one request type.
ISender.Send(IRequest, CancellationToken) Send a strongly typed void request. Void pipeline behaviors run, then the single void handler runs.
ISender.Send<TResponse>(IRequest<TResponse>, CancellationToken) Send a strongly typed request. Pipeline behaviors run, then the single handler runs, then the response is returned.
ISender.Send(object, CancellationToken) Send when the request type is known only at runtime. Same behavior as typed send after AstraFlow verifies the object implements exactly one void or response request contract.
IPipelineBehavior<TRequest, TResponse>.Handle(...) Wrap request handling with validation, logging, authorization, caching, or feature gates. Behaviors run in DI registration order and may short-circuit.
IRequestPipelineBehavior<TRequest>.Handle(...) Wrap void request handling. Behaviors run in DI registration order and may short-circuit completion.
IRequestPreProcessor<TRequest>.Process(...) Run logic before a request pipeline. Pre-processors run before the handler pipeline.
IRequestPostProcessor<TRequest, TResponse>.Process(...) Run logic after a response request succeeds. Post-processors see the request and response after successful handling.
IRequestExceptionAction<...>.Execute(...) Observe request exceptions for logging/metrics. Actions run side effects and the original exception is rethrown.
IRequestExceptionHandler<...>.Handle(...) Convert selected request exceptions into handled results. Handlers must explicitly call SetHandled(...) to suppress the exception.
IStreamRequest<TResponse> Mark a request that returns IAsyncEnumerable<TResponse>. The request can be dispatched through IStreamSender.
IStreamRequestHandler<TRequest, TResponse>.Handle(...) Implement stream handling. The handler returns an async stream without buffering the whole result.
IStreamSender.CreateStream(...) Dispatch a stream request. Stream behaviors run, then the single stream handler returns the stream.
IStreamPipelineBehavior<TRequest, TResponse>.Handle(...) Wrap stream request handling. Behaviors can shape or observe the async stream.
INotification Mark an in-process event. The notification can be published to zero or more handlers.
INotificationHandler<TNotification>.Handle(...) React to a notification. All handlers for the notification type are invoked sequentially.
IPublisher.Publish<TNotification>(...) Publish a strongly typed notification. Handlers run according to NotificationFailurePolicy.
IPublisher.Publish(object, CancellationToken) Publish when the notification type is known only at runtime. AstraFlow verifies the object implements INotification, then publishes it.

Mapper

API Use It For Expected Result
IMapper.Map<TDestination>(object? source) Map a source object to a destination type. Returns the mapped value, default for null source, or throws when no single rule owns the pair.
IMapper.Map(object? source, Type destinationType) Map when the destination type is known only at runtime. Same rule lookup behavior as generic mapping.
IObjectMappingRule.CanMap(Type, Type) Declare whether a rule owns a source/destination pair. Exactly one rule should return true for any active pair.
IObjectMappingRule.Map(object?, Type, IMapper) Implement the mapping code. Returns the destination object and may use mapper for nested explicit mappings.
IDeclaredObjectMappingRule.DeclaredMappings Make mapping ownership machine-checkable. Startup validation can catch duplicates, undeclared rules, and declaration drift.
ObjectMappingPair.Create<TSource, TDestination>() Declare an owned mapping pair without repeating typeof(...). Produces a pair used by validation and diagnostics.
IObjectMappingValidator.Validate(MappingOptions) Validate registered mapping rules manually. Throws clear errors for invalid mapping catalogs.
IProjection<TSource, TDestination>.Expression Define provider-translatable query projection. Used by ProjectWith to keep query DTO shape explicit.
INamedProjection<TSource, TDestination>.Name Give a projection an explicit name. Multiple projections can safely share the same source/destination pair.
IProjectionRegistry.Get<TSource, TDestination>() Resolve the only unnamed projection for a pair. Returns the projection or throws clearly for missing/ambiguous registrations.
IProjectionRegistry.Get<TSource, TDestination>(string name) Resolve a named projection. Returns the named projection or throws clearly for missing/duplicate names.
IProjectionValidator.Validate(MappingOptions) Validate registered projections manually. Returns stable AFP... findings for duplicates and high-risk expressions.
query.ProjectWith(...) Apply an explicit LINQ projection directly or through the registry. Returns IQueryable<TDestination> using the supplied/resolved expression.
ISecureIdCodec Plug in application-owned ID encryption/decryption. AstraFlow stays decoupled from secrets and algorithms.
SecureIdMapper Use secure ID conversion inside mapping rules. Converts required or optional Guid values to encrypted strings and attempts decryption.

Diagnostics

API Use It For Expected Result
AddAstraFlowDiagnostics(...) Add diagnostics reporting after core AstraFlow registration. Captures service descriptors and registers the diagnostics reporter.
IAstraFlowDiagnosticsReporter.CreateReport() Create an in-memory report. Returns registrations, findings, and a health-check-ready summary object.
IAstraFlowDiagnosticsReporter.CreateJsonReport() Export diagnostics for tools or CI. Returns deterministic camelCase JSON.
IAstraFlowDiagnosticsReporter.CreateMarkdownReport() Export human-readable diagnostics. Returns a Markdown report with summary, findings, and registration tables.
DiagnosticSeverity Classify findings. Uses Info, Warning, Error, and Fatal.

Testing

API Use It For Expected Result
FakeSender Record sent requests and return configured responses without a DI container. Tests can assert request dispatch through RecordedRequest entries.
FakePublisher Record published notifications and optionally run fake handlers. Tests can assert notification fan-out without a real mediator.
FakeMediator Combine fake sender and publisher behavior. Units depending on IMediator, ISender, or IPublisher can be tested without mocking frameworks.
HandlerTestHarness<TRequest, TResponse> Execute one request handler directly. Handler tests stay small and do not require a host.
PipelineTestHarness<TRequest, TResponse> Execute pipeline behaviors around a terminal delegate. Tests can verify order, short-circuiting, and exception flow.
NotificationHandlerTestHarness<TNotification> Execute one notification handler directly. Notification handler tests stay focused.
TestSecureIdCodec Deterministic test-only secure ID codec. Secure ID mapping tests can round-trip IDs without real keys.

Entity Framework Core

API Use It For Expected Result
dbContext.ValidateProjectionTranslation(projection) Validate one projection against EF Core's relational translator. Returns generated SQL or throws the EF Core translation/model error.
dbContext.ValidateProjectionTranslations(registry) Validate registered projections against an EF Core DbContext. Returns AFPEF... findings without executing the query.

Design Principles

  • Explicit by default: mapping rules must be code you can review.
  • Security first: sensitive fields are not mapped by naming convention unless a future optional package is explicitly enabled.
  • Clear failure modes: missing handlers, duplicate handlers, missing mappings, duplicate mappings, and undeclared mappings fail with actionable messages.
  • No application lock-in: AstraFlow does not depend on any private product, Result, ASP.NET Core MVC, FluentValidation, tenants, permissions, or a specific ID encryption implementation.
  • Extension-ready: pipelines, notification failure policies, projections, and secure ID codecs are designed as narrow public contracts.

Quick Start: Mediator

using AstraFlow.Mediator;
using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();
services.AddAstraFlowMediator(typeof(CreateInvoiceCommand));

using var provider = services.BuildServiceProvider();
var sender = provider.GetRequiredService<ISender>();

var id = await sender.Send(new CreateInvoiceCommand("INV-1001"));

public sealed record CreateInvoiceCommand(string Number) : IRequest<Guid>;

public sealed class CreateInvoiceCommandHandler
    : IRequestHandler<CreateInvoiceCommand, Guid>
{
    public Task<Guid> Handle(CreateInvoiceCommand request, CancellationToken cancellationToken)
    {
        return Task.FromResult(Guid.NewGuid());
    }
}

Quick Start: Pipeline Behavior

Pipeline behaviors run in registration order and may short-circuit by not calling next.

services.AddScoped(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(FeatureGateBehavior<,>));

Quick Start: Mapper

using AstraFlow.Mapper;
using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();
services.AddAstraFlowMapper(typeof(UserMappingRule));

using var provider = services.BuildServiceProvider();
var mapper = provider.GetRequiredService<IMapper>();

var dto = mapper.Map<UserResponse>(new User(Guid.NewGuid(), "admin"));

public sealed record User(Guid Id, string UserName);
public sealed record UserResponse(Guid Id, string UserName);

public sealed class UserMappingRule : IDeclaredObjectMappingRule
{
    public IReadOnlyCollection<ObjectMappingPair> DeclaredMappings { get; } =
    [
        ObjectMappingPair.Create<User, UserResponse>()
    ];

    public bool CanMap(Type sourceType, Type destinationType)
    {
        return sourceType == typeof(User) && destinationType == typeof(UserResponse);
    }

    public object? Map(object? source, Type destinationType, IMapper mapper)
    {
        var user = (User)source!;
        return new UserResponse(user.Id, user.UserName);
    }
}

Quick Start: Projections

Register projections with the mapper marker assembly, then resolve them through the registry:

public sealed class UserListProjection : INamedProjection<User, UserListItem>
{
    public string Name => "list";

    public Expression<Func<User, UserListItem>> Expression =>
        user => new UserListItem(user.Id, user.UserName);
}

services.AddAstraFlowMapper(
    [typeof(UserListProjection)],
    options =>
    {
        options.ValidateProjectionCatalogOnStartup = true;
        options.ProjectionValidationMode = ProjectionValidationMode.Warning;
    });

var registry = provider.GetRequiredService<IProjectionRegistry>();
var query = db.Users.ProjectWith<User, UserListItem>(registry, "list");

Projection validation reports warnings by default. Set ProjectionValidationMode.Error in CI or strict startup validation when projection findings should fail the build or application startup.

Quick Start: Convention Mapping

Install the optional conventions package only where convention mapping is deliberate:

dotnet add package AstraFlow.Mapper.Conventions --version 1.5.2

Register exact pairs through a profile:

services.AddAstraFlowMapper(typeof(UserProfile));
services.AddAstraFlowConventionMapping(catalog => catalog.AddProfile<UserProfile>());

public sealed class UserProfile : ConventionMappingProfile
{
    public UserProfile()
    {
        CreateMap<User, UserResponse>()
            .ForMember(destination => destination.DisplayName, member => member
                .MapFrom(source => source.Name)
                .Required())
            .ForMember(destination => destination.Score, member => member.NullSubstitute(0))
            .Ignore(nameof(UserResponse.InternalNote));
    }
}

Convention mapping stays disabled for every pair that is not registered. Member rules, converters, conditions, null substitution, enum decisions, and constructor-bound record members are included in mapping plans so every convention-created member can be reviewed before publishing.

Existing-destination updates are separate from read DTO mapping:

CreateMap<UserPatch, User>()
    .EnableUpdateMapping()
    .ForMember(destination => destination.Email, member => member.Condition(source => source.HasEmail));

provider.GetRequiredService<IConventionMapper>().MapInto(patch, user);

Sensitive destination writes remain blocked unless explicitly allowed.

Quick Start: EF Core Projection Checks

Install the optional package only in projects that need EF Core validation:

dotnet add package AstraFlow.Mapper.EntityFrameworkCore --version 1.5.2

Then ask EF Core to translate registered projections without executing the query:

using AstraFlow.Mapper.EntityFrameworkCore;

var efReport = dbContext.ValidateProjectionTranslations(registry);

Static projection validation catches high-risk expression patterns such as custom method calls. EF Core validation proves the source entity is mapped and the provider can generate SQL for the projection shape.

Secure ID Mapping

AstraFlow.Mapper provides the abstraction, not the cryptography. Applications own the encryption implementation.

services.AddScoped<ISecureIdCodec, MySecureIdCodec>();
services.AddScoped<SecureIdMapper>();

Mapping rules can then depend on SecureIdMapper and emit encrypted string IDs without coupling the package to application secrets.

Notification Failure Policies

Notifications are sequential by default. Configure how failures are handled:

services.Configure<NotificationPublishOptions>(options =>
{
    options.FailurePolicy = NotificationFailurePolicy.Aggregate;
    options.PublishStrategy = NotificationPublishStrategy.BoundedParallel;
    options.MaxDegreeOfParallelism = 4;
});

Policies:

  • FailFast: stop at the first failing handler.
  • Continue: log failures and run remaining handlers.
  • Aggregate: run all handlers, then throw one AggregateException.

Publish strategies:

  • Sequential: default and safest for ordered handlers or shared scoped state.
  • Parallel: run all handlers concurrently.
  • BoundedParallel: run handlers concurrently with a maximum degree of parallelism.

Quick Start: Diagnostics

Register diagnostics after mediator and mapper services:

using AstraFlow.Diagnostics;

services.AddAstraFlowMediator(typeof(CreateInvoiceCommand));
services.AddAstraFlowMapper(typeof(UserMappingRule));
services.AddAstraFlowDiagnostics(options =>
{
    options.AssemblyMarkerTypes.Add(typeof(CreateInvoiceCommand));
    options.AssemblyMarkerTypes.Add(typeof(UserMappingRule));
});

Create reports:

var reporter = provider.GetRequiredService<IAstraFlowDiagnosticsReporter>();

var report = reporter.CreateReport();
var json = reporter.CreateJsonReport();
var markdown = reporter.CreateMarkdownReport();

Diagnostics are framework-neutral and do not expose request payloads, DTO payloads, secrets, tokens, or connection strings.

Quick Start: Testing

Install the optional testing package in test projects:

dotnet add package AstraFlow.Testing --version 1.5.2

Use the fake mediator to record requests and notifications:

var mediator = new FakeMediator()
    .RespondWith<CreateInvoiceCommand, Guid>(Guid.NewGuid());

var id = await mediator.Send(new CreateInvoiceCommand("INV-1001"));

mediator.Requests.SingleSent<CreateInvoiceCommand>();

The testing package is framework-neutral and does not depend on xUnit, NUnit, MSTest, FluentAssertions, or a mocking framework.

v1 Non-Goals

AstraFlow v1 intentionally does not include convention mapping, flattening, reverse-map generation, compatibility shims, source generators, or analyzers. Those belong in optional packages after the explicit core is stable in real production use.

Roadmap

The long-term plan is to continue improving mediator ergonomics, optional convention mapping, advanced mapping parity, analyzers, source generators, OpenTelemetry hooks, benchmark projects, ASP.NET Core helpers, validation integration, CLI/templates, broader EF Core provider checks, and transition tooling. These will remain opt-in so the secure explicit core stays predictable.

Branding

The package icon is stored at assets/branding/astraflow-icon.png and is included in every NuGet package through PackageIcon.

Generator prompt:

Create a square app/package icon for a .NET library named AstraFlow. Use an abstract orbital star and flowing path motif that suggests explicit application flow, mediator dispatch, and auditable mapping. Keep it as a clean vector-friendly modern tech logo with crisp edges, centered symbol only, no text, strong silhouette readable at 64x64, generous padding, deep navy background with cyan, teal, white, and a small warm amber star accent. Avoid words, letters, code snippets, watermarks, photorealism, and complex gradients.

Repository Readiness

The package folder includes CI, a gated publish workflow, security policy, contributing guide, changelog, samples, and release checklist. Publishing should happen only after:

  • package tests pass,
  • representative consumer applications build against the package projects or packed packages successfully,
  • package artifacts build with XML docs and symbols,
  • the API surface is reviewed for v1 stability,
  • NuGet Trusted Publishing is configured, or a scoped GitHub Actions publishing secret is configured in the release repository.

For first publish setup, create a dedicated GitHub repository, copy this folder into the repository root, configure Trusted Publishing or the documented GitHub secret, and run the gated publish workflow. See docs/publishing.md.

License

MIT.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  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. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.6.2 0 6/3/2026
1.6.1 3 6/2/2026
1.6.0 55 6/1/2026
1.5.2 91 5/26/2026
1.5.1 95 5/23/2026
1.5.0 93 5/19/2026
1.4.2 98 5/18/2026
1.4.1 85 5/18/2026
1.4.0 88 5/17/2026
1.3.0 87 5/15/2026

AstraFlow 1.6.2:
     - Promotes v1.6.x inheritance and polymorphic mapping candidate follow-ups.
     - Adds IncludeBase and IncludeDerived for explicit convention mapping hierarchy support.
     - Adds AFC017, AFC018, and AFC019 diagnostics for inheritance and polymorphic mapping visibility.
     - Full changelog: https://github.com/seifmoustafa/AstraFlow/blob/main/CHANGELOG.md
     - GitHub releases: https://github.com/seifmoustafa/AstraFlow/releases