Multiple handlers for the same request were previously resolved via .First(), with ordering depending on Type.GetInterfaces() order (non-deterministic). Now ScalarRequestInvoker/StreamRequestInvoker throw InvalidOperationException listing the candidate handlers when more than one matches.
64 lines
3 KiB
Markdown
64 lines
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
|
|
|
|
### 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
|
|
- **request.dispatcher:** Throw `InvalidOperationException` listing candidates when multiple handlers match a request instead of silently resolving via `.First()`. Also throws when no handler is registered
|
|
|
|
### 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
|