23 lines
1.6 KiB
Markdown
23 lines
1.6 KiB
Markdown
# 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 `AyCode.Services.Server/docs/SIGNALR/README.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<int, AcMethodInfoModel>` once per service type. Immutable after creation.
|
|
- **Global cache:** `AcDynamicMethodRegistry` maintains a `ConcurrentDictionary<int, AcMethodInfoModel>` 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.
|