B3.Blicks.Resolver 2026.7.18.6

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 via NuGet.Protocol.
  • Verify each downloaded .nupkg against 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 CacheDirectory is 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-version marker 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, and B3.Blicks.Contracts are 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 FailFast on, an undeliverable selection throws so the pod crashloops (the startupProbe never 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

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