Skip to content

Repository files navigation

Context System

License.NET

A thread safe, async safe context management system with built-in security boundaries for .NET applications.

Features

  • Thread-Safe & Async-Safe - Built on AsyncLocal<T> for automatic context isolation
  • Security Boundaries - Defensive copy pattern prevents untrusted code from accessing sensitive data
  • Multi-Tenant Ready - Perfect for SaaS applications requiring tenant isolation
  • Plugin-Friendly - Safe context exposure to third-party plugins
  • Distributed Tracing - Built-in support for correlation IDs and trace context
  • High Performance - Minimal overhead (~100ns per operation)

Quick Start

usingModularityKit.Context.Abstractions;usingModularityKit.Context.Extensions;// 1. Define your contextpublicclassMyContext:IContext{publicstringId{get;}publicDateTimeOffsetCreatedAt{get;}publicstringUserId{get;}publicstringTenantId{get;}}// 2. Register in DIservices.AddContext<MyContext>();// 3. Use in your codepublicclassOrderService(IContextAccessor<MyContext>context){publicvoidProcessOrder(){varctx=context.RequireCurrent();Console.WriteLine($"Processing for user: {ctx.UserId}");}}// 4. Execute with contextvarcontext=newMyContext("ctx-1","user-123","tenant-456");awaitcontextManager.ExecuteInContext(context,async()=>{orderService.ProcessOrder();});

🎯 Why Use Context System?

Without Context System ❌

publicclassOrderService{// Passing context everywhere - painful!publicasyncTaskCreateOrder(stringuserId,stringtenantId,stringcorrelationId){awaitValidateOrder(userId,tenantId,correlationId);awaitProcessPayment(userId,tenantId,correlationId);awaitSendEmail(userId,tenantId,correlationId);}}

With Context System ✅

publicclassOrderService(IContextAccessor<MyContext>context){// Clean API - context flows automaticallypublicasyncTaskCreateOrder(){awaitValidateOrder();// Context flows automaticallyawaitProcessPayment();awaitSendEmail();}}

Documentation

Getting Started

Guides

Reference


Multi Tenant SaaS

publicclassDocumentService(IContextAccessor<MyContext>context){publicasyncTaskGetDocument(stringdocumentId){varctx=context.RequireCurrent();// Automatic tenant filteringreturnawait_db.Documents.Where(d =>d.TenantId==ctx.TenantId).Where(d =>d.Id==documentId).FirstOrDefaultAsync();}}

Automatic tenant isolation using IContextAccessor ensures security and data separation.

See full example →


Architecture

 Application Layer
├─ Trusted Code (Full Access)-> IContextAccessor<MyContext>
└─ Untrusted Code (Read-Only) -> IContextAccessor<IReadOnlyContext>
│
▼
Context Infrastructure
├─ ContextStore (AsyncLocal)
├─ ContextAccessor
└─ ContextManager
│
▼
Security Boundary
└─ ReadOnlyContextSnapshot (Defensive Copy)

Learn more about architecture →


Best Practices

DO ✅

  • Create context per operation (request/job)
  • Use RequireCurrent() when context is expected
  • Let ExecuteInContext handle cleanup
  • Treat contexts as immutable

DON'T ❌

  • Share context across operations
  • Mutate context properties
  • Use Current without null check
  • Store context in static fields

Read full best practices guide →


API Reference

Core Interfaces

Extension Methods

View complete API reference →


Built with ❤️ for .NET developers

About

Lightweight context framework for modular applications.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages