# DynamicMethods Reflection-based infrastructure for dynamically dispatching method calls by message tag, primarily used for SignalR message routing. > **Context:** This is the server-side dispatch engine for the SignalR tag-based architecture. > See [`docs/SIGNALR.md`](../../docs/SIGNALR.md) for the full message flow. ## How It Fits When `AcWebSignalRHubBase.OnReceiveMessage(tag, bytes, requestId)` is called, the hub uses `DynamicMethodRegistry` to resolve which method to invoke for the given tag. The registry scans all registered service instances for `[SignalR(tag)]` attributed methods, caches the lookup, and invokes the matching method with deserialized parameters. ## Caching Strategy - **Per-type cache:** `AcDynamicMethodCallModel` builds a `FrozenDictionary` once per service type. Immutable after creation. - **Global cache:** `AcDynamicMethodRegistry` maintains a `ConcurrentDictionary` populated lazily per tag on first request. - **Instance tracking:** The registry maps tags to owning instances for correct invocation context. ## Key Files - **`AcMethodInfoModel.cs`** — Wraps a `MethodInfo` and its `TagAttribute` with cached parameter metadata (`ParamInfos[]` for deserialization). - **`AcDynamicMethodCallModel.cs`** — Binds an object instance to its attributed methods, using a static `ConcurrentDictionary` and `FrozenDictionary` cache keyed by message tag. Reflection runs once per type. - **`AcDynamicMethodRegistry.cs`** — Registry with lazy method lookup across multiple registered instances. Caches discovered methods statically by message tag and resolves instances per request.