Vali-Flow
1.1.0
dotnet add package Vali-Flow --version 1.1.0
NuGet\Install-Package Vali-Flow -Version 1.1.0
<PackageReference Include="Vali-Flow" Version="1.1.0" />
<PackageVersion Include="Vali-Flow" Version="1.1.0" />
<PackageReference Include="Vali-Flow" />
paket add Vali-Flow --version 1.1.0
#r "nuget: Vali-Flow, 1.1.0"
#addin nuget:?package=Vali-Flow&version=1.1.0
#tool nuget:?package=Vali-Flow&version=1.1.0
Vali-Flow - Documentation
This document provides a comprehensive overview of the Vali-Flow library, a .NET library designed to simplify data access and validation in Entity Framework Core (EF Core) applications. The library offers a fluent API for building specifications (ValiFlow<T>
), a robust evaluator (ValiFlowEvaluator<T>
) for querying and modifying data, specification classes (QuerySpecification<T>
, BasicSpecification<T>
) for defining query criteria, and a generic repository (DbRepositoryAsync<T>
) for clean data access patterns. The documentation includes detailed descriptions, code examples, tables, and usage instructions.
Table of Contents
- Overview
- Core Components
- Specification Components
- Repository Components
- Component Summary
- Usage
- Implementation Details
- Dependencies
- Extensibility
- Features and Enhancements 🌟
- Code Structure
Overview
Vali-Flow is a .NET library that streamlines data access and validation in EF Core applications. It provides a fluent API for constructing complex query and validation specifications, a powerful evaluator for executing these specifications, and a generic repository for clean data access. The library is designed for clean architecture, separating concerns and promoting reusability.
Key features:
- Fluent Specification API: Build complex queries and validations using
ValiFlow<T>
and specification classes. - Asynchronous Data Access: All operations are asynchronous, supporting scalable applications.
- Generic Design: Works with any entity type
T
, reducing code duplication. - Extensible Repository:
DbRepositoryAsync<T>
integrates with the evaluator for clean data access. - Robust Error Handling: Includes validation and exception handling for reliable operations.
- Dependency Injection: Seamlessly integrates with ASP.NET Core.
The library is organized into core components (specifications and evaluation), specification components (query criteria), and repository components (data access).
Core Components
ValiFlow<T>
ValiFlow<T>
is a fluent API for building specifications that define query filters, validations, or conditions for entities of type T
. It resides in the Vali-Flow.Core
namespace and supports chaining methods to construct complex logic.
Key Features:
- Supports building filters, validations, and query conditions.
- Provides methods like
Build()
andBuildNegated()
to generateExpression<Func<T, bool>>
. - Used by
ValiFlowEvaluator<T>
and specification classes to define criteria.
Code Example:
using Vali_Flow.Core;
var spec = new ValiFlow<Product>()
.Add(p => p.Price > 100)
.Add(p => p.Category == "Electronics");
Expression<Func<Product, bool>> filter = spec.Build();
IEvaluatorRead<T>
IEvaluatorRead<T>
defines methods for querying data asynchronously, supporting filtering, grouping, aggregation, and pagination.
Method Summary:
Method | Description | Parameters | Return Type |
---|---|---|---|
EvaluateAsync |
Evaluates condition on entity | ValiFlow<T> , T |
Task<bool> |
EvaluateAnyAsync |
Checks for matching entities | IBasicSpecification<T> , CancellationToken |
Task<bool> |
EvaluateCountAsync |
Counts matching entities | IBasicSpecification<T> , CancellationToken |
Task<int> |
EvaluateGetFirstAsync |
Gets first matching entity | IBasicSpecification<T> , CancellationToken |
Task<T?> |
EvaluateGetFirstFailedAsync |
Gets first non-matching entity | IBasicSpecification<T> , CancellationToken |
Task<T?> |
EvaluateGetLastAsync |
Gets last matching entity | IBasicSpecification<T> , CancellationToken |
Task<T?> |
EvaluateGetLastFailedAsync |
Gets last non-matching entity | IBasicSpecification<T> , CancellationToken |
Task<T?> |
EvaluateQueryAsync |
Builds query for matching entities | IQuerySpecification<T> |
Task<IQueryable<T>> |
EvaluateQueryFailedAsync |
Builds query for non-matching | IQuerySpecification<T> |
Task<IQueryable<T>> |
EvaluateDistinctAsync<TKey> |
Gets distinct entities | IQuerySpecification<T> , Expression<Func<T, TKey>> |
Task<IQueryable<T>> |
EvaluateDuplicatesAsync<TKey> |
Gets duplicate entities | IQuerySpecification<T> , Expression<Func<T, TKey>> |
Task<IQueryable<T>> |
EvaluateMinAsync<TResult> |
Computes minimum value | IBasicSpecification<T> , Expression<Func<T, TResult>> , CancellationToken |
Task<TResult> |
EvaluateMaxAsync<TResult> |
Computes maximum value | IBasicSpecification<T> , Expression<Func<T, TResult>> , CancellationToken |
Task<TResult> |
EvaluateAverageAsync<TResult> |
Computes average value | IBasicSpecification<T> , Expression<Func<T, TResult>> , CancellationToken |
Task<decimal> |
EvaluateSumAsync |
Computes sum of selector | IBasicSpecification<T> , Expression<Func<T, TNum>> , CancellationToken |
Task<TNum> |
EvaluateAggregateAsync<TResult> |
Applies custom aggregator | IBasicSpecification<T> , Expression<Func<T, TResult>> , Func<TResult, TResult, TResult> , CancellationToken |
Task<TResult> |
EvaluateGroupedAsync<TKey> |
Groups entities by key | IBasicSpecification<T> , Expression<Func<T, TKey>> , CancellationToken |
Task<Dictionary<TKey, List<T>>> |
EvaluateCountByGroupAsync<TKey> |
Counts entities per group | IBasicSpecification<T> , Expression<Func<T, TKey>> , CancellationToken |
Task<Dictionary<TKey, int>> |
EvaluateSumByGroupAsync<TKey> |
Sums values per group | IBasicSpecification<T> , Expression<Func<T, TKey>> , Expression<Func<T, TNum>> , CancellationToken |
Task<Dictionary<TKey, TNum>> |
EvaluateMinByGroupAsync<TKey> |
Gets minimum per group | IBasicSpecification<T> , Expression<Func<T, TKey>> , Expression<Func<T, TNum>> , CancellationToken |
Task<Dictionary<TKey, TNum>> |
EvaluateMaxByGroupAsync<TKey> |
Gets maximum per group | IBasicSpecification<T> , Expression<Func<T, TKey>> , Expression<Func<T, TNum>> , CancellationToken |
Task<Dictionary<TKey, TNum>> |
EvaluateAverageByGroupAsync<TKey, TResult> |
Averages values per group | IBasicSpecification<T> , Expression<Func<T, TKey>> , Expression<Func<T, TResult>> , CancellationToken |
Task<Dictionary<TKey, decimal>> |
EvaluateDuplicatesByGroupAsync<TKey> |
Gets duplicate groups | IBasicSpecification<T> , Expression<Func<T, TKey>> , CancellationToken |
Task<Dictionary<TKey, List<T>>> |
EvaluateUniquesByGroupAsync<TKey> |
Gets unique groups | IBasicSpecification<T> , Expression<Func<T, TKey>> , CancellationToken |
Task<Dictionary<TKey, T>> |
EvaluateTopByGroupAsync<TKey> |
Gets top entities per group | IQuerySpecification<T> , Expression<Func<T, TKey>> , CancellationToken |
Task<Dictionary<TKey, List<T>>> |
IEvaluatorWrite<T>
IEvaluatorWrite<T>
defines methods for modifying data asynchronously, including adding, updating, deleting, and bulk operations.
Method Summary:
Method | Description | Parameters | Return Type |
---|---|---|---|
AddAsync |
Adds a single entity | T , bool saveChanges , CancellationToken |
Task<T> |
AddRangeAsync |
Adds multiple entities | IEnumerable<T> , bool saveChanges , CancellationToken |
Task<IEnumerable<T>> |
UpdateAsync |
Updates a single entity | T , bool saveChanges , CancellationToken |
Task<T> |
UpdateRangeAsync |
Updates multiple entities | IEnumerable<T> , bool saveChanges , CancellationToken |
Task<IEnumerable<T>> |
DeleteAsync |
Deletes a single entity | T , bool saveChanges , CancellationToken |
Task |
DeleteRangeAsync |
Deletes multiple entities | IEnumerable<T> , bool saveChanges , CancellationToken |
Task |
SaveChangesAsync |
Persists changes | CancellationToken |
Task |
UpsertAsync |
Adds or updates entity | T , Expression<Func<T, bool>> , bool saveChanges , CancellationToken |
Task<T> |
UpsertRangeAsync<TProperty> |
Adds or updates entities | IEnumerable<T> , Func<T, TProperty> , bool saveChanges , CancellationToken |
Task<IEnumerable<T>> |
DeleteByConditionAsync |
Deletes by condition | Expression<Func<T, bool>> , bool saveChanges , CancellationToken |
Task |
ExecuteTransactionAsync |
Executes in transaction | Func<Task> , CancellationToken |
Task |
BulkInsertAsync |
Performs bulk insert | IEnumerable<T> , BulkConfig? , CancellationToken |
Task |
BulkUpdateAsync |
Performs bulk update | IEnumerable<T> , BulkConfig? , CancellationToken |
Task |
BulkDeleteAsync |
Performs bulk delete | IEnumerable<T> , BulkConfig? , CancellationToken |
Task |
BulkInsertOrUpdateAsync |
Performs bulk insert/update | IEnumerable<T> , BulkConfig? , CancellationToken |
Task |
ValiFlowEvaluator<T>
ValiFlowEvaluator<T>
is the core class that implements IEvaluatorRead<T>
and IEvaluatorWrite<T>
. It provides the logic for querying and modifying data using EF Core, leveraging ValiFlow<T>
and specification classes.
Key Features:
- Accepts a
DbContext
for database operations. - Implements all methods from
IEvaluatorRead<T>
andIEvaluatorWrite<T>
. - Supports advanced querying (e.g., grouping, aggregation) and bulk operations.
- Uses
QuerySpecification<T>
andBasicSpecification<T>
for query composition.
Code Example:
using Vali_Flow.Classes.Evaluators;
public class ValiFlowEvaluator<T> : IEvaluatorRead<T>, IEvaluatorWrite<T> where T : class
{
private readonly DbContext _dbContext;
public ValiFlowEvaluator(DbContext dbContext)
{
_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext), "The provided DbContext is null.");
}
// Implementation details omitted for brevity
}
Specification Components
BasicSpecification<T>
BasicSpecification<T>
is a base class for defining simple query specifications, including filters, inclusions, and EF Core configurations (e.g., change tracking, split queries). It implements IBasicSpecification<T>
and resides in the Vali_Flow.Classes.Specification
namespace.
Key Features:
- Defines a
ValiFlow<T>
filter for query criteria. - Supports including related entities via
AddInclude
. - Configures EF Core options like
AsNoTracking
,AsSplitQuery
, andIgnoreQueryFilters
. - Provides chainable methods for fluent configuration.
Method Summary:
Method | Description | Parameters | Return Type |
---|---|---|---|
WithFilter |
Updates validation filter | ValiFlow<T> |
BasicSpecification<T> |
AddInclude<TProperty> |
Adds related entity include | Expression<Func<T, TProperty>> |
BasicSpecification<T> |
WithAsNoTracking |
Configures change tracking | bool asNoTracking |
BasicSpecification<T> |
WithAsSplitQuery |
Configures split queries | bool asSplitQuery |
BasicSpecification<T> |
WithIgnoreQueryFilters |
Ignores global query filters | bool ignoreQueryFilters |
BasicSpecification<T> |
Code Example:
using System.Linq.Expressions;
using Vali_Flow.Classes.Specification;
using Vali_Flow.Core;
var spec = new BasicSpecification<Product>(new ValiFlow<Product>().Add(p => p.Price > 100))
.AddInclude(p => p.Category)
.WithAsNoTracking(true)
.WithIgnoreQueryFilters(true);
QuerySpecification<T>
QuerySpecification<T>
extends BasicSpecification<T>
and implements IQuerySpecification<T>
. It adds support for ordering, pagination, and limiting the number of results, making it ideal for complex queries.
Key Features:
- Supports primary ordering (
WithOrderBy
) and secondary ordering (AddThenBy
,AddThenBys
). - Configures pagination (
WithPagination
,WithPage
,WithPageSize
) and maximum items (WithTop
). - Inherits filter and inclusion capabilities from
BasicSpecification<T>
.
Method Summary:
Method | Description | Parameters | Return Type |
---|---|---|---|
WithOrderBy<TProperty> |
Sets primary ordering | Expression<Func<T, TProperty>> , bool ascending |
QuerySpecification<T> |
AddThenBy<TProperty> |
Adds secondary ordering | Expression<Func<T, TProperty>> , bool ascending |
QuerySpecification<T> |
AddThenBys<TProperty> |
Adds multiple ordering | IEnumerable<Expression<Func<T, TProperty>>> , bool ascending |
QuerySpecification<T> |
WithPagination |
Configures pagination | int page , int pageSize |
QuerySpecification<T> |
WithPage |
Sets page number | int page |
QuerySpecification<T> |
WithPageSize |
Sets page size | int pageSize |
QuerySpecification<T> |
WithTop |
Limits number of items | int top |
QuerySpecification<T> |
Code Example:
using System.Linq.Expressions;
using Vali_Flow.Classes.Specification;
using Vali_Flow.Core;
var spec = new QuerySpecification<Product>(new ValiFlow<Product>().Add(p => p.Price > 100))
.WithOrderBy(p => p.Price, false)
.AddThenBy(p => p.Name)
.WithPagination(2, 10)
.WithTop(50);
Repository Components
ApplicationDbContext
ApplicationDbContext
is the EF Core DbContext
used for database interactions in the repository layer. It defines the database schema and configures the connection to a SQL Server database.
Key Features:
- Inherits from
Microsoft.EntityFrameworkCore.DbContext
. - Configured via
DbContextOptions<ApplicationDbContext>
. - Used by
DbRepositoryAsync<T>
and passed toValiFlowEvaluator<T>
.
Code Example:
namespace Infrastructure.Data;
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
// Example DbSet properties
// public DbSet<Product> Products { get; set; }
}
IReadRepositoryAsync<T>
IReadRepositoryAsync<T>
is an interface for read-only data operations, inheriting from IEvaluatorRead<T>
.
Key Features:
- Provides access to all query methods defined in
IEvaluatorRead<T>
. - Generic constraint ensures
T
is a class. - Can be extended with additional methods.
Code Example:
namespace Application.Interfaces.ValiFlow;
public interface IReadRepositoryAsync<T> : IEvaluatorRead<T> where T : class
{
// Inherits methods from IEvaluatorRead<T>
}
IWriteRepositoryAsync<T>
IWriteRepositoryAsync<T>
is an interface for write operations, inheriting from IEvaluatorWrite<T>
.
Key Features:
- Provides access to all write methods defined in
IEvaluatorWrite<T>
. - Generic constraint ensures
T
is a class. - Supports bulk operations.
Code Example:
namespace Application.Interfaces.ValiFlow;
public interface IWriteRepositoryAsync<T> : IEvaluatorWrite<T> where T : class
{
// Inherits methods from IEvaluatorWrite<T>
}
DbRepositoryAsync<T>
DbRepositoryAsync<T>
is a generic repository class that extends ValiFlowEvaluator<T>
and implements IReadRepositoryAsync<T>
and IWriteRepositoryAsync<T>
. It provides a clean interface for data access.
Key Features:
- Inherits all method implementations from
ValiFlowEvaluator<T>
. - Uses
ApplicationDbContext
for database interactions. - Validates
ApplicationDbContext
to ensure it is not null. - Extensible for custom methods or overrides.
Code Example:
namespace Infrastructure.Repositories;
public class DbRepositoryAsync<T> : ValiFlowEvaluator<T>, IReadRepositoryAsync<T>, IWriteRepositoryAsync<T> where T : class
{
private readonly ApplicationDbContext _dbContext;
public DbRepositoryAsync(ApplicationDbContext dbContext) : base(dbContext)
{
_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext), "The provided DbContext is null.");
}
}
Dependency Injection
The dependency injection setup registers ApplicationDbContext
and DbRepositoryAsync<T>
with the ASP.NET Core dependency injection container.
Key Features:
- Configures
ApplicationDbContext
with a SQL Server connection string. - Registers
DbRepositoryAsync<T>
for bothIReadRepositoryAsync<T>
andIWriteRepositoryAsync<T>
.
Dependency Injection Summary:
Service | Implementation | Scope | Description |
---|---|---|---|
ApplicationDbContext |
ApplicationDbContext |
Scoped | EF Core database access |
IReadRepositoryAsync<T> |
DbRepositoryAsync<T> |
Scoped | Read-only data access |
IWriteRepositoryAsync<T> |
DbRepositoryAsync<T> |
Scoped | Data modification methods |
Code Example:
namespace Infrastructure;
public static class DependencyInjection
{
public static IServiceCollection AddInfrastructure(this IServiceCollection services, string connectionString)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
services.AddScoped(typeof(IReadRepositoryAsync<>), typeof(DbRepositoryAsync<>));
services.AddScoped(typeof(IWriteRepositoryAsync<>), typeof(DbRepositoryAsync<>));
return services;
}
}
Component Summary :
Component | Namespace | Description |
---|---|---|
ValiFlow<T> |
Vali_Flow.Core |
Fluent API for specifications |
IEvaluatorRead<T> |
Vali_Flow.Interfaces.Evaluators.Read |
Read-only data operations |
IEvaluatorWrite<T> |
Vali_Flow.Interfaces.Evaluators.Write |
Data modification operations |
ValiFlowEvaluator<T> |
Vali_Flow.Classes.Evaluators |
Data access logic |
BasicSpecification<T> |
Vali_Flow.Classes.Specification |
Simple query specifications |
QuerySpecification<T> |
Vali_Flow.Classes.Specification |
Complex query specifications |
ApplicationDbContext |
Infrastructure.Data |
EF Core database context |
IReadRepositoryAsync<T> |
Application.Interfaces.ValiFlow |
Read repository interface |
IWriteRepositoryAsync<T> |
Application.Interfaces.ValiFlow |
Write repository interface |
DbRepositoryAsync<T> |
Infrastructure.Repositories |
Generic repository |
DependencyInjection |
Infrastructure |
DI configuration |
Usage
The Vali-Flow library can be used in three primary ways:
- Core Usage: Use
ValiFlow<T>
andValiFlowEvaluator<T>
for specification-based data access. - Specification Usage: Use
BasicSpecification<T>
orQuerySpecification<T>
for complex query composition. - Repository Usage: Use
DbRepositoryAsync<T>
for clean data access patterns.
Core Usage Example:
var evaluator = new ValiFlowEvaluator<Product>(dbContext);
var spec = new QuerySpecification<Product>(new ValiFlow<Product>().Add(p => p.Price > 100));
var products = await evaluator.EvaluateQueryAsync(spec);
var count = await evaluator.EvaluateCountAsync(spec);
Specification Usage Example:
var spec = new QuerySpecification<Product>()
.WithFilter(new ValiFlow<Product>().Add(p => p.Price > 100))
.WithOrderBy(p => p.Price, false)
.AddInclude(p => p.Category)
.WithPagination(1, 20);
var evaluator = new ValiFlowEvaluator<Product>(dbContext);
var products = await evaluator.EvaluateQueryAsync(spec);
Repository Usage Example:
public class ProductService
{
private readonly IReadRepositoryAsync<Product> _readRepository;
private readonly IWriteRepositoryAsync<Product> _writeRepository;
public ProductService(
IReadRepositoryAsync<Product> readRepository,
IWriteRepositoryAsync<Product> writeRepository)
{
_readRepository = readRepository;
_writeRepository = writeRepository;
}
public async Task<Product> AddProductAsync(Product product)
{
return await _writeRepository.AddAsync(product);
}
public async Task<Product?> GetProductByIdAsync(int id)
{
var spec = new QuerySpecification<Product>(new ValiFlow<Product>().Add(p => p.Id == id));
return await _readRepository.EvaluateGetFirstAsync(spec);
}
}
Service Configuration:
using Infrastructure;
var builder = WebApplication.CreateBuilder(args);
// Configure services
var connectionString = "Server=.;Database=MyDb;Trusted_Connection=True;";
builder.Services.AddInfrastructure(connectionString);
builder.Services.AddScoped<ProductService>();
var app = builder.Build();
// Configure the HTTP request pipeline (example)
app.MapGet("/", () => "Hello, World!");
app.Run();
Implementation Details
- ValiFlow<T>: Provides a fluent API for constructing
Expression<Func<T, bool>>
expressions, used by specifications and evaluators. - BasicSpecification<T>: Defines basic query criteria, including filters and inclusions, with EF Core-specific configurations.
- QuerySpecification<T>: Extends
BasicSpecification<T>
to support ordering, pagination, and limiting results. - ValiFlowEvaluator<T>: Implements the core logic for querying and modifying data, using EF Core and specifications.
- DbRepositoryAsync<T>: Extends
ValiFlowEvaluator<T>
to provide a repository pattern, inheriting all data access methods. - Error Handling: Includes validation (e.g., null checks, pagination constraints) and exception handling across components.
- Asynchronous Design: All methods are asynchronous, ensuring scalability.
Dependencies
The Vali-Flow library relies on the following NuGet packages:
Vali_Flow.Core
:- Description: Vali_Flow.Core is a component of the Vali-Flow library for managing validations in .NET in a fluent and expressive way. It allows developers to define data validations and query specifications using chained expressions, making code writing and maintenance easier. Compatible with multiple data types, it provides intuitive methods for validating strings, dates, collections, and general comparisons.
- Release Notes:
- New integration of the specification pattern into the methods.
- Improved stability and compatibility with Vali-Flow library components.
- New methods for reading (batch read data) and writing with Entity Framework Core.
- Compatible with: .NET 7, .NET 8, .NET 9
- Available at https://www.nuget.org/packages/Vali-Flow.Core/.
Microsoft.EntityFrameworkCore
: Core EF Core functionality for database operations.EFCore.BulkExtensions
: Support for bulk operations to enhance performance.
NuGet Packages:
<PackageReference Include="Vali_Flow.Core" Version="1.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />
<PackageReference Include="EFCore.BulkExtensions" Version="8.0.0" />
Extensibility
The library is highly extensible:
- Custom Specifications: Extend
ValiFlow<T>
,BasicSpecification<T>
, orQuerySpecification<T>
with new methods. - Evaluator Overrides: Derive from
ValiFlowEvaluator<T>
to customize query or write logic. - Repository Methods: Add custom methods to
DbRepositoryAsync<T>
for application-specific needs. - Interface Extensions: Add methods to
IReadRepositoryAsync<T>
orIWriteRepositoryAsync<T>
.
Example: Adding a Custom Repository Method:
public class DbRepositoryAsync<T> : ValiFlowEvaluator<T>, IReadRepositoryAsync<T>, IWriteRepositoryAsync<T> where T : class
{
private readonly ApplicationDbContext _dbContext;
public DbRepositoryAsync(ApplicationDbContext dbContext) : base(dbContext)
{
_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext), "The provided DbContext is null.");
}
public async Task<IEnumerable<T>> GetByCustomFilterAsync(Expression<Func<T, bool>> filter)
{
var spec = new QuerySpecification<T>(new ValiFlow<T>().Add(filter));
var query = await EvaluateQueryAsync(spec);
return await query.ToListAsync();
}
}
Features and Enhancements 🌟
The Vali-Flow library is actively developed with new features and improvements to enhance its functionality and usability.
Recent Updates
- Enhanced Expression Building: Improved Vali-Flow.Core to support more complex and reusable expression composition, enabling developers to create dynamic and scalable query filters with ease.
- Optimized Specification Evaluation: Enhanced ValiFlowEvaluator<T> to improve performance for complex specifications, including better handling of includes, pagination, and grouping operations.
- Bulk Operation Improvements: Optimized bulk operations (e.g.,
BulkInsertAsync
,BulkUpdateAsync
) in Vali-Flow for faster data manipulation, with improved integration with EF Core and Vali-Flow.Core specifications. - Multi-targeting Support: Added support for .NET 7, 8, and 9, ensuring Vali-Flow’s compatibility with modern .NET ecosystems.
Planned Features
- Request Pre-processing and Post-processing Hooks: Support for hooks to execute custom logic before and after request processing in Vali-Flow, enhancing flexibility for specification and query execution.
- Enhanced Debugging Tools: Improved tools for debugging pipeline execution in Vali-Flow, providing better insights into operation flows for specification evaluation and data access.
Follow the project on GitHub for updates on new features and improvements!
Donations 💖
If you find Vali-Flow useful and would like to support its development, consider making a donation:
- For Latin America: Donate via MercadoPago
- For International Donations: Donate via PayPal
Your contributions help keep this project alive and improve its development! 🚀
License 📜
This project is licensed under the Apache License 2.0.
Contributions 🤝
Feel free to open issues and submit pull requests to improve this library!
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net7.0 is compatible. 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 was computed. 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. |
-
net7.0
- EFCore.BulkExtensions (>= 7.8.1)
- Microsoft.EntityFrameworkCore (>= 7.0.20)
- Microsoft.EntityFrameworkCore.Relational (>= 7.0.20)
- Vali-Flow.Core (>= 1.0.4)
-
net8.0
- EFCore.BulkExtensions (>= 7.8.1)
- Microsoft.EntityFrameworkCore (>= 7.0.20)
- Microsoft.EntityFrameworkCore.Relational (>= 7.0.20)
- Vali-Flow.Core (>= 1.0.4)
-
net9.0
- EFCore.BulkExtensions (>= 7.8.1)
- Microsoft.EntityFrameworkCore (>= 7.0.20)
- Microsoft.EntityFrameworkCore.Relational (>= 7.0.20)
- Vali-Flow.Core (>= 1.0.4)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
-Enhanced Expression Building: Improved Vali_Flow.Core to support more complex and reusable expression composition, enabling developers to create dynamic and scalable query filters with ease.
-Optimized Specification Evaluation: Enhanced ValiFlowEvaluator to improve performance for complex specifications, including better handling of includes, pagination, and grouping operations.
-Bulk Operation Improvements: Optimized bulk operations (e.g., BulkInsertAsync, BulkUpdateAsync) in Vali_Flow for faster data manipulation, with improved integration with EF Core and Vali_Flow.Core specifications.