Strongly-typed templates
One POCO per template with [SitecoreTemplate] and [SitecoreField]. Read fields through GetField<TextField>() with real IntelliSense.
Axlis.ORM · Shipped · v0.3.0
Synthesis and Glass gave classic Sitecore developers strongly-typed templates for years. Headless moved the data behind a GraphQL Edge endpoint — and left teams hand-writing queries and mapping raw JSON. Axlis.ORM brings the typed item model back: define a class per template, fetch by path or ID, traverse the tree, and let caching and diagnostics come for free.
What you get
Everything below ships in the v0.1.0-preview package family, today.
One POCO per template with [SitecoreTemplate] and [SitecoreField]. Read fields through GetField<TextField>() with real IntelliSense.
Parent, Children, Siblings, GetChildren(predicate) and GetDescendants() — lazy-loaded through an ambient loader wired at startup.
Items are dual-indexed by ID and path, so a later lookup by either key resolves without a second fetch. Nulls are never cached, so re-published items reappear.
The default transport is raw HttpClient plus System.Text.Json. Swap in any custom IGraphQLTransport if you need to.
Clean Get*Async<T>() returns T? and never throws. Rich Get*WithResultAsync<T>() returns metadata and diagnostics for observability.
GetItemsByPaths chunks paths into batched alias queries and runs them in parallel — one round trip for many items.
From install to first item
Register with a single call, describe your template as a class, then resolve items through ISitecoreFacade. Axes traversal and caching are already wired.
Axlis.ORM and Axlis.ORM.GraphQL from NuGet.AxlisGraphQL:Endpoint at your GraphQL Edge URL.AddAxlisORM() and UseAxlis() at startup.[SitecoreTemplate("{6D1CD897-1936-4A3A-A511-289A94C2A7B1}")]
public class DictionaryEntry : ExtendedItem
{
[SitecoreField("Key")]
public TextField Key => GetField<TextField>("Key");
[SitecoreField("Phrase")]
public TextField Phrase => GetField<TextField>("Phrase");
}
// Fetch, then traverse the tree
var entry = await facade.GetItemByPathAsync<DictionaryEntry>(
"/sitecore/content/dictionary/my-key");
var phrase = entry?.Phrase.RawValue;
var children = entry?.Axes.Children;
var parent = entry?.Axes.Parent;The package family
Reference the whole stack, or just the contracts. Each package points strictly inward.
The facade, cache manager and DI wiring. Start here with AddAxlisORM().
Default HttpClient + STJ transport, SitecoreService and the batched query builder.
The domain model — Item, field types, ExtendedItem, AxesAdapter and ItemConverter.
Contracts, NoOps, AxlisResult<T> and codegen-hook attributes. Safe from any layer.
Questions
It maps Sitecore items exposed through the GraphQL Edge endpoint onto strongly-typed .NET classes. With Axlis you define one class per template and query items by path or ID — no hand-written GraphQL, no manual JSON mapping.
No. The default transport uses raw HttpClient and System.Text.Json. There's no dependency on GraphQL.Client, StrawberryShake or similar — and the transport is swappable via IGraphQLTransport.
Yes. Axlis targets any Sitecore headless instance exposing a GraphQL Edge endpoint, including XM Cloud and Sitecore Experience Edge. Point AxlisGraphQL:Endpoint at your edge URL.
Yes — MIT licensed, open source on GitHub and published on NuGet. Free for commercial and personal use.