B3.Blicks.Resolver 2026.6.27.4
B3.Blicks.Resolver
The Blick delivery library a B3 app shell runs at startup. It turns a set of selected versions + a
feed into loaded Blicks: resolve package versions against NuGet, download each Blick and its
dependency closure, verify content hashes (fail-closed), lay out static web assets, and load each Blick
into its own isolated, non-collectible AssemblyLoadContext — returning a catalog the shell wires into
the Blazor router and DI. Selection-source-agnostic — it never decides which Blicks to run (the
selected versions) or where they come from (the supplied sources).
Usage
var selectedVersions = SelectedVersions.Of(
("B3.Blicks.ReportsSample.Blick", "[2.0.0,3.0.0)"),
("B3.Blicks.NotesSample.Blick", "1.1.*"));
var options = new ResolverOptions
{
Sources = [ new BlickServerSource("https://api.blicks.b3soft.net", apiKey: blickKey) ], // the proprietary BlickServer registry (dev: api.blicks-dev.b3soft.net)
CacheDirectory = "/var/cache/b3-blicks", // scratch dir for the current run; pods are stateless (not an availability mechanism)
LayoutDirectory = "/var/lib/b3-blicks",
Logger = myErrorLogger, // optional; a no-op is used when null
// FailFast = true, RequireContentHash = true (production defaults)
};
LoadedBlickSet set = await new BlickResolver().ResolveAndLoad(selectedVersions, options);
// Wire the shell:
// router.AdditionalAssemblies = set.Assemblies
// endpoints.AddAdditionalAssemblies(set.Assemblies)
// foreach blick: blick.ConfigureServices(services)
// startupProbe -> set.IsReady
LocalPathSource("/path/to/packages") swaps the feed for a folder of .nupkg files (or loose
{Assembly}.dlls) in the dev loop — same shape, offline.
Behaviour
- Resolve exact (
2.0.0), floating (2.0.*), range ([2.0.0,3.0.0)), and prerelease (2.1.0-preview.3) package versions viaNuGet.Protocol. - Verify each downloaded
.nupkgagainst the feed-provided content hash (base64 SHA-512) before it is ever loaded; a mismatch — or a missing-but-required hash — throws and the bytes are not loaded. - Download packages once per run; downloads run in parallel. The
CacheDirectoryis run-scoped scratch — pods are stateless, so it is not a cross-restart last-known-good store and not the availability mechanism (availability comes from running replicas of the feed + B3.Configuration). The on-disk layout is reused within a run when a.blick-versionmarker shows the resolved version is already extracted, so a retry skips re-extraction. - Auth to a private feed via
FeedCredential(Username, Password)(HTTP basic, attached to every feed request). A feed that gates reads behind a key exposes it as the basic-auth password — there is no v3 read protocol that authenticates a download with a bare API key (that header is push-only). - Isolate each Blick in its own non-collectible
AssemblyLoadContext: the runtime, ASP.NET Core/Blazor, andB3.Blicks.Contractsare shared (single type identity); private third-party dependencies are isolated, so two Blicks with conflicting transitive versions do not clash. No hot-unload — updates happen by restart. - Fail-fast: with
FailFaston, an undeliverable selection throws so the pod crashloops (thestartupProbenever goes green) rather than starting with a partial Blick set.
Public API
SelectedVersions / SelectedVersion · ResolverOptions · FeedCredential · BlickSource (FeedSource,
LocalPathSource) · BlickResolver.ResolveAndLoad(selectedVersions, options) : Task<LoadedBlickSet> ·
LoadedBlickSet (Assemblies, Blicks, NavItems, Widgets, IsReady, Unresolved) ·
LoadedBlick · BlickLoadContext · BlickHashMismatchException · BlickResolutionException.
Showing the top 20 packages that depend on B3.Blicks.Resolver.
| Packages | Downloads |
|---|---|
|
B3.Blicks.TestKit
Integration-test harness for B3 Blicks: contract, load, and combination assertions via NUnit v4 + bUnit.
|
11 |
|
B3.Blicks.TestKit
Integration-test harness for B3 Blicks: contract, load, and combination assertions via NUnit v4 + bUnit.
|
9 |
|
B3.Blicks.TestKit
Integration-test harness for B3 Blicks: contract, load, and combination assertions via NUnit v4 + bUnit.
|
7 |
|
B3.Blicks.TestKit
Integration-test harness for B3 Blicks: contract, load, and combination assertions via NUnit v4 + bUnit.
|
6 |
|
B3.Blicks.TestKit
Integration-test harness for B3 Blicks: contract, load, and combination assertions via NUnit v4 + bUnit.
|
5 |
.NET 10.0
- B3.Blicks.Contracts (>= 2026.6.27.4)
- B3.Common.SimpleLogging (>= 2026.5.12.1)
- NuGet.Protocol (>= 6.13.2)
| Version | Downloads | Last updated |
|---|---|---|
| 2026.8.6.1 | 7 | 8/6/2026 |
| 2026.8.3.3 | 5 | 8/4/2026 |
| 2026.8.3.2 | 4 | 8/4/2026 |
| 2026.8.3.1 | 1 | 8/4/2026 |
| 2026.8.1.1 | 5 | 8/1/2026 |
| 2026.7.31.1 | 4 | 7/31/2026 |
| 2026.7.30.1 | 9 | 7/30/2026 |
| 2026.7.26.4 | 4 | 7/27/2026 |
| 2026.7.26.3 | 1 | 7/27/2026 |
| 2026.7.26.2 | 4 | 7/26/2026 |
| 2026.7.26.1 | 3 | 7/26/2026 |
| 2026.7.23.5 | 4 | 7/23/2026 |
| 2026.7.23.4 | 4 | 7/23/2026 |
| 2026.7.23.3 | 4 | 7/23/2026 |
| 2026.7.23.2 | 1 | 7/23/2026 |
| 2026.7.23.1 | 4 | 7/23/2026 |
| 2026.7.22.1 | 4 | 7/22/2026 |
| 2026.7.19.1 | 4 | 7/19/2026 |
| 2026.7.18.19 | 4 | 7/19/2026 |
| 2026.7.18.18 | 4 | 7/19/2026 |
| 2026.7.18.17 | 4 | 7/18/2026 |
| 2026.7.18.16 | 1 | 7/18/2026 |
| 2026.7.18.15 | 4 | 7/18/2026 |
| 2026.7.18.14 | 4 | 7/18/2026 |
| 2026.7.18.13 | 1 | 7/18/2026 |
| 2026.7.18.12 | 1 | 7/18/2026 |
| 2026.7.18.11 | 4 | 7/18/2026 |
| 2026.7.18.10 | 1 | 7/18/2026 |
| 2026.7.18.9 | 4 | 7/18/2026 |
| 2026.7.18.8 | 4 | 7/18/2026 |
| 2026.7.18.7 | 1 | 7/18/2026 |
| 2026.7.18.6 | 4 | 7/18/2026 |
| 2026.7.18.5 | 1 | 7/18/2026 |
| 2026.7.18.4 | 4 | 7/18/2026 |
| 2026.7.18.3 | 1 | 7/18/2026 |
| 2026.7.18.2 | 4 | 7/18/2026 |
| 2026.7.18.1 | 11 | 7/18/2026 |
| 2026.7.17.2 | 4 | 7/17/2026 |
| 2026.7.17.1 | 4 | 7/17/2026 |
| 2026.7.13.1 | 8 | 7/14/2026 |
| 2026.7.5.2 | 5 | 7/5/2026 |
| 2026.7.5.1 | 5 | 7/5/2026 |
| 2026.7.4.4 | 11 | 7/4/2026 |
| 2026.7.4.3 | 6 | 7/4/2026 |
| 2026.7.4.2 | 6 | 7/4/2026 |
| 2026.7.4.1 | 6 | 7/4/2026 |
| 2026.7.3.2 | 7 | 7/3/2026 |
| 2026.7.3.1 | 5 | 7/3/2026 |
| 2026.6.30.5 | 5 | 7/1/2026 |
| 2026.6.30.4 | 5 | 6/30/2026 |
| 2026.6.30.3 | 5 | 6/30/2026 |
| 2026.6.30.2 | 2 | 6/30/2026 |
| 2026.6.30.1 | 2 | 6/30/2026 |
| 2026.6.29.8 | 5 | 6/30/2026 |
| 2026.6.29.7 | 2 | 6/30/2026 |
| 2026.6.29.6 | 5 | 6/30/2026 |
| 2026.6.29.5 | 2 | 6/30/2026 |
| 2026.6.29.4 | 2 | 6/30/2026 |
| 2026.6.29.3 | 5 | 6/30/2026 |
| 2026.6.29.2 | 2 | 6/30/2026 |
| 2026.6.29.1 | 5 | 6/30/2026 |
| 2026.6.28.3 | 5 | 6/28/2026 |
| 2026.6.28.2 | 5 | 6/28/2026 |
| 2026.6.28.1 | 2 | 6/28/2026 |
| 2026.6.27.6 | 5 | 6/28/2026 |
| 2026.6.27.5 | 5 | 6/28/2026 |
| 2026.6.27.4 | 2 | 6/28/2026 |
| 2026.6.27.3 | 2 | 6/28/2026 |
| 2026.6.27.2 | 2 | 6/28/2026 |
| 2026.6.27.1 | 5 | 6/27/2026 |