📔 Contents
- 📢 Introduction
- 🏋️ Stability
- 🏡 In-House
- 🏛️ History
- 🍱 Modularization
- 💁 Platform Compatibility
- 📋 Release Notes
- 💬 Feedback
JJ.Framework are extensions of the .NET Framework: the nuts, bolts and screws of software development: reusable components. Some of which might be expected to be there in .NET, but seem to be missing there.
JJ.Framework contains reusable code, that was produced along with real-life applications.
No software is bug free, but extra effort was made, testing the JJ.Framework components, that were published to NuGet which includes automated testing.
The ones not on NuGet are available as a sneek peek in JJs-Pre-Release-Package-Feed. But those may be used with caution, because they may not be tested that well. Those may need some more unit testing and could still be a bug or two in it.
JJ.Framework was made in the spirit of: small things: develop your own, instead of importing a huge framework.
JJ.Framework components are compact: a couple of kilobytes each.
Developed in-house so that it could be adapted and extended as needed. It did not have to be complete, because then we would just extend it.
If a bug was found in the development of an app, we could just correct the JJ.Framework as needed and release a stable app.
Of course, this 'in-house development' argument does not apply, when other people use it. But I think these extensions could be of use to others too.
Any reusable code independent of a particular business domain, was moved to this JJ.Framework, for reuse. The reusable code was gathered up between 2010 and 2026. It was a hobby project. But something similar to this framework, was also developed professionally in a team of 7 of which I was the technical lead at the time.
JJ.Framework tends to have a separate assembly for each part of the .NET Framework that it extends. Separation may be found between technical aspects. That may allow being specific, on which parts of .NET an application becomes dependent.
JJ.Framework also likes to decouple platform-specific implementation details and hide them behind generalized interfaces.
That grip on dependency, was once a good plan for platform compatibility. Some of JJ.Framework is still based on .NET 4.6.1 trying to keep it compatible with Mono. Around 2015 JJ.Framework was tested to be reasonably compatible with Mono and by extension Android, iOS and Windows Phone. This was before newer technology like .NET Standard and .NET 5 + emerged, which could make platform-compatibility a bit more doable. For this reason, some of the JJ.Framework is currently being ported to a newer .NET, but this is still in progress.
- Internal tooling
- Triggers initialization at start of
JJ.Frameworksolution build.
JJ.Framework.Existence.Core- Initial release
JJ.Framework.Existence.CorespaceMattersflags everywherecaseMattersreplacedignoreCaseStringBulder/stringmore combos possiblex.In(a, b, c)extension favored over staticIn(x, a, b, c)
JJ.Framework.Existence.CoreJJ.Framework.Reflection.Legacy- Separate
Legacyversion lineages - For more stable package updates.
- Expanded IntelliSense docs.
JJ.Framework.Existence.CoreJJ.Framework.Reflection.Legacy- Compatibility with AOT "Ahead-Of-Time" native compilation, code trimming and single-executable, self-contained apps
JJ.Framework.Existence.Core- Flag when you consider
0meaningful (not nully)
- Upgraded with explicit support for
.NET 10
JJ.Framework.Existence.Core- Simplify overload picking removing some
[Prio]attributes - Sacrifices direct use of keywords e.g.
Coalesce(null, "Hallo"); not a real use case anyway.
JJ.Framework.Existence.CoreJJ.Framework.Reflection.Legacy- Flags at the beginning of the parameter list, now don't come with a performance penalty.
JJ.Framework.Existence.Core- More notation options for flags for the
Containsmethod
JJ.Framework.Existence.Core- Support flags in front for the
FilledInmethod
JJ.Framework.Existence.Core- Leading flags for
Has/Is/In/IsNully(supplements trailing flags) - Improved
Coalesceresolution and performance for 4+ values and collections. - Added overloads for reduced clashes between
boolflags and value lists. - Various non-critical renames for clarity and modularity.
JJ.Framework.Common.CoreOverloadByNamehelper for an optional parameter trick to simulate overloading by name, not normally possible in C#.
JJ.Framework.Business.Legacy- Release of historic version. Full test coverage. Features:
EntityStatusManagerandGetListIsDirty:- Framework-agnostic
New/Deleted/Dirtyflag container. ISideEffectfor keeping business logic units separated.- Bug fix: Entity status
NewandDeletedwere accidentally stored asDirty.
JJ.Framework.IO.Legacy- Full test coverage, and member docs.
- Release of historic version
0.250. - Features:
CsvReader: simple streaming CSV reader supporting quoted fields and escaped double-quotes ("").StreamHelper: convenience conversions betweenStream,byte[]andstringReadStruct/WriteStruct: methods for simple reading and writing structs to streams.- Bug fix:
CsvReaderpreserves a trailing escaped quotes - Bug fix:
CsvReadersolved crash over trailing new line
- 2018 variant of
ReflectionCacheLegacymoved from Reflection.CoretoReflection.Legacywith test coverage.- Trimming/AOT compatiblity.
- Auto-run trim test
- upon build
- and inside NCrunch.
JJ.Framework.Validation.Legacy- Historic version + full test coverage / IntelliSense docs / code trimming / native AOT support
- .NET
10,9,8,7,6,5,4.6.1/ .NET Standard2.0,2.1 FluentValidatorsyntax:
For(() => player.TotalScore, "Total Score").Min(0).Max(100);NotNull,NotNullOrWhiteSpace,In,Is,IsNot,NotZero,Above,Min,Max,NotInteger,IsEnumValueIValidator/ValidatorBasemembers:
IsValid(boo),ValidationMessages,Verify()(throws)- Sub-validators and message prefixes:
"Address: Street is required." - Localization: English (
en-US) and Dutch (nl-NL)
JJ.Framework.PlatformCompatibility.Core- Run new code on older .NETs
- Shims for argument checks, language features, nullability, trimming/AOT, threading and hash codes
- Full test coverage and member docs
JJ.Framework.Validation.Legacy- More IntelliSense popups
- Reworked README
JJ.Framework.Mathematics.Legacy- Integer-based
PowandLog,GetRandomItemandRandomizer.GetInt32, number base converter. - 100% test coverage, compatibility with Code Trimming and AOT / native compilation, and a whole spread of .NET versions, and IntelliSense doc everywhere.
- Fix:
PowandLogedge-cases - Fix: Removed dependency on JJ.Framework.Reflection.Legacy
JJ.Framework.Testing.Core- Removed lambda from delta-based
AreEqual(trim-friendly) JJ.Framework.Testing.Core.MSTestless- Added stubs for data-driven tests.
- Improved Testing Architecture
Got feedback or questions? You can reach me here.