Integrate ManagedCode.Orleans.Graph into an Orleans-based .NET application for graph-oriented relationships, edge management, and traversal logic on top of Orleans grains.
dotnet skills install managedcode-orleans-graph
Build or review distributed .NET applications with Orleans grains, silos, persistence, streaming, reminders, placement, transactions, serialization, event sourcing, testing, and cloud-native hosting.
.NET code that uses Microsoft.Orleans.*, Grain, IGrainWith*, UseOrleans, UseOrleansClient, IGrainFactory, JournaledGrain, ITransactionalState, or Orleans silo/client buildersInProcessTestCluster, Aspire.Hosting.Testing, WebApplicationFactory, or shared AppHost fixtures[StatelessWorker] for stateless fan-out. Grain identity types:- IGrainWithGuidKey — globally unique entities - IGrainWithIntegerKey — relational DB integration - IGrainWithStringKey — flexible string keys - IGrainWithGuidCompoundKey / IGrainWithIntegerCompoundKey — composite identity with extension string
Task, Task<T>, or ValueTask<T>. Use IAsyncEnumerable<T> for streaming responses. Avoid .Result, .Wait(), blocking I/O, lock-based coordination. Use Task.WhenAll for parallel cross-grain calls. Apply [ResponseTimeout("00:00:05")] on interface methods when needed.- IPersistentState<TState> with [PersistentState("name", "provider")] for named persistent state (preferred) - Multiple named states per grain for different storage providers - JournaledGrain<TState, TEvent> for event-sourced grains - ITransactionalState<TState> for ACID transactions across grains - Grain<TState> is legacy — use only when constrained by existing code
- Standard grains for stateful request/response logic - [StatelessWorker] for pure stateless fan-out or compute helpers - Orleans streams for decoupled event flow and pub/sub with [ImplicitStreamSubscription] - Broadcast channels for fire-and-forget fan-out with [ImplicitChannelSubscription] - RegisterGrainTimer for activation-local periodic work (non-durable) - Reminders via IRemindable for durable low-frequency wakeups - Observers via IGrainObserver and ObserverManager<T> for one-way push notifications
- [GenerateSerializer] on all state and message types - [Id(N)] on each serialized member for stable identification - [Alias("name")] for safe type renaming - [Immutable] to skip copy overhead on immutable types - Use surrogates (IConverter<TOriginal, TSurrogate>) for types you don't own
- Default is non-reentrant single-threaded execution (safe but deadlock-prone with circular calls) - [Reentrant] on grain class for full interleaving - [AlwaysInterleave] on interface method for specific method interleaving - [ReadOnly] for concurrent read-only methods - RequestContext.AllowCallChainReentrancy() for scoped reentrancy - Native CancellationToken support (last parameter, optional default)
- UseOrleans for silos, UseOrleansClient for separate clients - Co-hosted client runs in same process (reduced latency, no extra serialization) - In Aspire, declare Orleans resource in AppHost, wire clustering/storage/reminders there, use .AsClient() for frontend-only consumers - In Aspire-backed tests, resolve Orleans backing-resource connection strings from the distributed app and feed them into the test host instead of duplicating local settings - Prefer TokenCredential with DefaultAzureCredential for Azure-backed providers
- In-memory storage, reminders, and stream providers are dev/test only - Persistence: Redis, Azure Table/Blob, Cosmos DB, ADO.NET, DynamoDB - Reminders: Azure Table, Redis, Cosmos DB, ADO.NET - Clustering: Azure Table, Redis, Cosmos DB, ADO.NET, Consul, Kubernetes - Streams: Azure Event Hubs, Azure Queue, Memory (dev only)
- ResourceOptimizedPlacement is default since 9.2 (CPU, memory, activation count weighted) - RandomPlacement, PreferLocalPlacement, HashBasedPlacement, ActivationCountBasedPlacement - SiloRoleBasedPlacement for role-targeted placement - Custom placement via IPlacementDirector + PlacementStrategy + PlacementAttribute - Placement filtering (9.0+) for zone-aware and hardware-affinity placement - Activation repartitioning and rebalancing are experimental
- Standard Microsoft.Extensions.Logging - System.Diagnostics.Metrics with meter "Microsoft.Orleans" - OpenTelemetry export via AddOtlpExporter + AddMeter("Microsoft.Orleans") - Distributed tracing via AddActivityPropagation() with sources "Microsoft.Orleans.Runtime" and "Microsoft.Orleans.Application" - Orleans Dashboard for operational visibility (secure with ASP.NET Core auth) - Health checks for cluster readiness
- InProcessTestCluster for new tests - Shared Aspire/AppHost fixtures for real HTTP, SignalR, SSE, or UI flows that must exercise the co-hosted Orleans topology - WebApplicationFactory<TEntryPoint> layered over a shared AppHost when tests need Host DI services, IGrainFactory, or direct grain/runtime access while keeping real infrastructure - Multi-silo coverage when placement, reminders, persistence, or failover matters - Benchmark hot grains before claiming the design scales - Use memory providers in test, real providers in integration tests
.NET code[GenerateSerializer], [Id], versioning via [Alias], and immutability annotations[GenerateSerializer] and [Id(N)] correctlyUseOrleans() or UseOrleansClient()[Reentrant], [AlwaysInterleave], or AllowCallChainReentrancy[Reentrant] and use PerformRead/PerformUpdateInProcessTestCluster, shared AppHost fixtures, WebApplicationFactory, SignalR, and PlaywrightIntegrate ManagedCode.Orleans.Graph into an Orleans-based .NET application for graph-oriented relationships, edge management, and traversal logic on top of Orleans grains.
dotnet skills install managedcode-orleans-graph
Use ManagedCode.Orleans.SignalR when a distributed .NET application needs Orleans-based coordination of SignalR real-time messaging, hub delivery, and grain-driven push flows.
dotnet skills install managedcode-orleans-signalr
Build long-running .NET background services with `BackgroundService`, Generic Host, graceful shutdown, configuration, logging, and deployment patterns suited to workers and…
dotnet skills install worker-services