Skip to content

jjvanzon/JJ.Framework

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3,295 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔩 JJ.Framework

📔 Contents

📢 Introduction

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.

🏋️ Stability

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.

🏡 In-House

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.

🏛️ History

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.

🍱 Modularization

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.

💁 Platform Compatibility

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.

📋 Release Notes

2025-03-31 | 1.9 : Build.csproj

  • Internal tooling
  • Triggers initialization at start of JJ.Framework solution build.

2025-06-14 | 2.5 : Existence.Core

2025-06-24 | 2.6 : Flags

  • JJ.Framework.Existence.Core
  • spaceMatters flags everywhere
  • caseMatters replaced ignoreCase
  • StringBulder/string more combos possible
  • x.In(a, b, c) extension favored over static In(x, a, b, c)

2025-07-02 | 2.7/0.250 : Legacy Lineage

2025-07-21 | 2.8/0.250 : Trimmable Libs

2026-01-25 | 2.9 : zeroMatters

2026-01-27 | 3.0/0.250 : .NET 10

  • Upgraded with explicit support for .NET 10

2026-01-28 | 3.1 : Less Prios

  • 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.

2026-01-30 | 3.2/0.250 : Leading Flags - Coalesce

2026-01-31 | 3.3 : Leading Flags - Contains

2026-02-01 | 3.4 : Leading Flags - FilledIn

2026-02-17 | 3.7 : Clash of the Booleans

  • JJ.Framework.Existence.Core
  • Leading flags for Has/Is/In/IsNully (supplements trailing flags)
  • Improved Coalesce resolution and performance for 4+ values and collections.
  • Added overloads for reduced clashes between bool flags and value lists.
  • Various non-critical renames for clarity and modularity.
  • JJ.Framework.Common.Core
  • OverloadByName helper for an optional parameter trick to simulate overloading by name, not normally possible in C#.

2026-02-23 | 3.8/0.250 Business.Legacy

  • JJ.Framework.Business.Legacy
  • Release of historic version. Full test coverage. Features:
  • EntityStatusManager and GetListIsDirty:
  • Framework-agnostic New/Deleted/Dirty flag container.
  • ISideEffect for keeping business logic units separated.
  • Bug fix: Entity status New and Deleted were accidentally stored as Dirty.

2026-02-26 | 3.9/0.250 : IO.Legacy

  • 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 between Stream, byte[] and string
  • ReadStruct/WriteStruct: methods for simple reading and writing structs to streams.
  • Bug fix: CsvReader preserves a trailing escaped quotes
  • Bug fix: CsvReader solved crash over trailing new line

2026-03-13 | 4.0/0.250 : Reflection.Legacy Re-Release

  • 2018 variant of ReflectionCacheLegacy moved from
  • Reflection.Core to
  • Reflection.Legacy with test coverage.
  • Trimming/AOT compatiblity.
  • Auto-run trim test
  • upon build
  • and inside NCrunch.

2026-03-15 | 4.1/0.251 : Validation.Legacy

  • 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 Standard 2.0, 2.1
  • FluentValidator syntax:
    For(() => player.TotalScore, "Total Score").Min(0).Max(100);
  • NotNull, NotNullOrWhiteSpace, In, Is, IsNot, NotZero, Above, Min, Max, NotInteger, IsEnumValue
  • IValidator / ValidatorBase members:
    IsValid (boo), ValidationMessages, Verify() (throws)
  • Sub-validators and message prefixes:
    "Address: Street is required."
  • Localization: English (en-US) and Dutch (nl-NL)

2026-04-04 | 4.4/0.252 : PlatformCompatibility.Core Initial , Validation.Legacy Docs

2026-04-08 | 4.5/0.253 : Math Legacy

💬 Feedback

Got feedback or questions? You can reach me here.