Handler/behavior resolution previously forced closed generics before open generics regardless of registration order, which was surprising and fragile. TypeIndex now tracks each registered type's index and orders matching candidates by registration order, so closed/open ordering is deterministic and follows registration.
65 lines
3.3 KiB
Markdown
65 lines
3.3 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to this project will be documented in this file.
|
|
|
|
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
|
## [1.0.0] - 2026-05-26
|
|
|
|
### Added
|
|
|
|
- **request.dispatcher:** Core mediator pattern implementation with async request/response handling
|
|
- **request.result:** Optional result wrapper types (`Result<T>`) for structured responses
|
|
- **request.validation:** Automatic validation pipeline behavior with FluentValidation integration
|
|
|
|
## [1.1.0] - 2026-05-28
|
|
|
|
### Added
|
|
|
|
- **request.validation:** Dependency injection support for validators via `IServiceCollection.AddValidation()`
|
|
- **request.validation:** `IValidatorBuilder` for fluent validator registration and assembly scanning
|
|
- **request.validation:** Support for open generic validators and automatic closing during resolution
|
|
- **request.validation:** `Validate<T>` extension method for simplified validator invocation
|
|
|
|
### Changed
|
|
|
|
- **request.dispatcher:** Reset type caches when reloading assemblies
|
|
- **request.validation:** Reset type caches when reloading assemblies
|
|
|
|
## [2.0.0] - 2026-05-30
|
|
|
|
## Breaking changes
|
|
|
|
To have a consistent experience across all packages, some public interfaces have been renamed.
|
|
|
|
### Changed
|
|
|
|
- **request.dispatcher:** Hide pipeline internals in stack frames
|
|
- **request.validation:** Rename `IValidatorBuilder` to `IRequestValidatorBuilder` incl. extensions methods
|
|
|
|
## [Unreleased]
|
|
|
|
### Added
|
|
|
|
- **request.validation:** Support `PropertyPath` JSON converter for string values and dictionary property names
|
|
|
|
### Changed
|
|
|
|
- **request.result:** Document that `Result`/`Result<T>` equality treats any two failures as equal, ignoring error content; branch on the `Error` directly for failure-specific logic (see PLAN.md Inconsistencies#E)
|
|
|
|
### Fixed
|
|
|
|
- **request.result:** Correct the namespace in the `Prelude` doc comment (`Geekeey.Extensions.Result` → `Geekeey.Request.Result`)
|
|
- **request.result:** Fold `IsSuccess` into `Result<T>.GetHashCode` to avoid collisions between a failure and a success value whose hash is `0`
|
|
- **request.validation:** Guard null comparison bounds in `GreaterThan`/`LessThan`/`Between` etc. so a `null` bound no longer throws (`NullReferenceException`)
|
|
- **request.validation:** Return no problems when validating a `null` instance of a reference type instead of dereferencing it (`NullReferenceException`)
|
|
- **request.validation:** Make `Severity` meaningful — `Validation.IsValid` now only fails on `Error` problems; `Warning`/`Info` no longer invalidate. Added `Validation.IsValidFor(Severity)` to set the failing-severity threshold (see PLAN.md Inconsistencies#B)
|
|
- **request.dispatcher:** Throw `InvalidOperationException` listing candidates when multiple handlers match a request instead of silently resolving via `.First()` (matches MediatR). Also throws when no handler is registered (see PLAN.md Inconsistencies#C)
|
|
- **request.dispatcher:** Resolve handlers/behaviors in registration order across closed and open generics instead of the fixed closed-before-open reflection order (see PLAN.md Inconsistencies#D)
|
|
|
|
### Removed
|
|
|
|
[1.0.0]: https://code.geekeey.de/geekeey/request/releases/tag/1.0.0
|
|
[1.1.0]: https://code.geekeey.de/geekeey/request/releases/tag/1.1.0
|
|
[2.0.0]: https://code.geekeey.de/geekeey/request/releases/tag/2.0.0
|
|
[Unreleased]: https://code.geekeey.de/geekeey/request/compare/2.0.0...HEAD
|