B3.Blicks.Resolver 2026.8.6.1

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
    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.
24
B3.Blicks.TestKit
Integration-test harness for B3 Blicks: contract, load, and combination assertions via NUnit v4 + bUnit.
14
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.
10
B3.Blicks.TestKit
Integration-test harness for B3 Blicks: contract, load, and combination assertions via NUnit v4 + bUnit.
8
B3.Blicks.TestKit
Integration-test harness for B3 Blicks: contract, load, and combination assertions via NUnit v4 + bUnit.
7

.NET 10.0

Version Downloads Last updated
2026.8.6.1 183 8/6/2026
2026.8.3.3 7 8/4/2026
2026.8.3.2 6 8/4/2026
2026.8.3.1 3 8/4/2026
2026.8.1.1 10 8/1/2026
2026.7.31.1 6 7/31/2026
2026.7.30.1 11 7/30/2026
2026.7.26.4 6 7/27/2026
2026.7.26.3 3 7/27/2026
2026.7.26.2 6 7/26/2026
2026.7.26.1 5 7/26/2026
2026.7.23.5 7 7/23/2026
2026.7.23.4 7 7/23/2026
2026.7.23.3 7 7/23/2026
2026.7.23.2 4 7/23/2026
2026.7.23.1 7 7/23/2026
2026.7.22.1 7 7/22/2026
2026.7.19.1 7 7/19/2026
2026.7.18.19 7 7/19/2026
2026.7.18.18 7 7/19/2026
2026.7.18.17 7 7/18/2026
2026.7.18.16 4 7/18/2026
2026.7.18.15 7 7/18/2026
2026.7.18.14 7 7/18/2026
2026.7.18.13 4 7/18/2026
2026.7.18.12 4 7/18/2026
2026.7.18.11 7 7/18/2026
2026.7.18.10 4 7/18/2026
2026.7.18.9 7 7/18/2026
2026.7.18.8 7 7/18/2026
2026.7.18.7 4 7/18/2026
2026.7.18.6 7 7/18/2026
2026.7.18.5 4 7/18/2026
2026.7.18.4 7 7/18/2026
2026.7.18.3 4 7/18/2026
2026.7.18.2 7 7/18/2026
2026.7.18.1 14 7/18/2026
2026.7.17.2 7 7/17/2026
2026.7.17.1 7 7/17/2026
2026.7.13.1 11 7/14/2026
2026.7.5.2 7 7/5/2026
2026.7.5.1 7 7/5/2026
2026.7.4.4 13 7/4/2026
2026.7.4.3 8 7/4/2026
2026.7.4.2 8 7/4/2026
2026.7.4.1 8 7/4/2026
2026.7.3.2 9 7/3/2026
2026.7.3.1 7 7/3/2026
2026.6.30.5 7 7/1/2026
2026.6.30.4 7 6/30/2026
2026.6.30.3 7 6/30/2026
2026.6.30.2 4 6/30/2026
2026.6.30.1 4 6/30/2026
2026.6.29.8 7 6/30/2026
2026.6.29.7 4 6/30/2026
2026.6.29.6 7 6/30/2026
2026.6.29.5 4 6/30/2026
2026.6.29.4 4 6/30/2026
2026.6.29.3 7 6/30/2026
2026.6.29.2 4 6/30/2026
2026.6.29.1 7 6/30/2026
2026.6.28.3 7 6/28/2026
2026.6.28.2 7 6/28/2026
2026.6.28.1 4 6/28/2026
2026.6.27.6 7 6/28/2026
2026.6.27.5 7 6/28/2026
2026.6.27.4 4 6/28/2026
2026.6.27.3 4 6/28/2026
2026.6.27.2 4 6/28/2026
2026.6.27.1 7 6/27/2026