This commit is contained in:
2026-04-17 14:55:32 -04:00
commit bc3ac1d4c9
18017 changed files with 4371742 additions and 0 deletions

View File

@@ -0,0 +1,109 @@
---
source_files:
- Common/DTS.CommonCore/BusyIndicatorManager/xBusyIndicator.xaml.cs
- Common/DTS.CommonCore/BusyIndicatorManager/BusyIndicatorManager.cs
generated_at: "2026-04-16T11:56:30.835743+00:00"
model: "zai-org/GLM-5-FP8"
schema_version: 1
sha256: "85046dce961f12c2"
---
# Documentation: DTS.Common.BusyIndicatorManager
## 1. Purpose
This module provides a centralized mechanism for managing busy indicator UI state across an application. It implements a singleton-based manager (`BusyIndicatorManager`) that tracks multiple concurrent busy operations by unique ID, allowing different parts of the application to show/hide busy indicators without conflicting with each other. The `xBusyIndicator` class serves as a WPF user control for displaying the busy indicator UI.
---
## 2. Public Interface
### `BusyIndicatorManager` (class)
**Inherits from:** `NotificationObject` (Microsoft.Practices.Prism.ViewModel)
#### Singleton Access
```csharp
public static BusyIndicatorManager Instance { get; }
```
Returns the singleton instance of `BusyIndicatorManager`. Thread-safe via lock synchronization on `SyncRoot`.
#### Properties
```csharp
public bool IsBusy { get; }
```
Indicates whether any busy operation is currently active. Read-only from external callers; set internally via `ShowBusy`/`CloseBusy`. Raises `PropertyChanged` notification.
```csharp
public string Message { get; }
```
The current message to display in the busy indicator. Read-only from external callers. Raises `PropertyChanged` notification.
#### Methods
```csharp
public void ShowBusy(int id, string busyMessage)
```
Registers a busy operation with the given `id` and displays `busyMessage`. If the `id` already exists, updates the message. Sets `IsBusy` to `true` and updates `Message`.
```csharp
public void CloseBusy(int id)
```
Removes the busy operation identified by `id`. If no busy operations remain, sets `IsBusy` to `false` and clears `Message`. If other operations remain, keeps `IsBusy` as `true` and sets `Message` to the last entry's value in `busyParameters`.
---
### `xBusyIndicator` (class)
**Inherits from:** Not explicitly shown; appears to be a WPF partial class (likely `UserControl`).
```csharp
public xBusyIndicator()
```
Default constructor that calls `InitializeComponent()`.
```csharp
public void Connect(int connectionId, object target)
```
Method present in the class but **implementation is empty**. Purpose unclear from source alone.
---
## 3. Invariants
- **Singleton guarantee:** Only one instance of `BusyIndicatorManager` can exist per process. Access is always through `BusyIndicatorManager.Instance`.
- **Thread-safe initialization:** The singleton is lazily initialized with lock-based synchronization.
- **ID uniqueness:** Each busy operation is identified by a unique `int` ID. Callers are responsible for ensuring IDs do not collide.
- **State consistency:** `IsBusy` is `true` if and only if `busyParameters.Count > 0`.
- **Message consistency:** When `IsBusy` is `false`, `Message` is an empty string. When `IsBusy` is `true`, `Message` reflects the most recently added/updated busy message.
- **Property change notifications:** `IsBusy` and `Message` raise `PropertyChanged` via `RaisePropertyChanged()` when modified.
---
## 4. Dependencies
### This module depends on:
- `Microsoft.Practices.Prism.ViewModel` — specifically `NotificationObject` for `INotifyPropertyChanged` implementation
- `System.Collections.Generic``Dictionary<TKey, TValue>`
- `System.Linq``Enumerable.Last()` extension method
- `System.Windows.Controls` — referenced in `xBusyIndicator`
- `Xceed.Wpf.Toolkit` — referenced in `xBusyIndicator` (likely provides the actual busy indicator control)
### What depends on this module:
- **Cannot be determined from source alone.** Consumers would bind to `BusyIndicatorManager.Instance.IsBusy` and `Message` properties, or instantiate `xBusyIndicator` in XAML views.
---
## 5. Gotchas
1. **`xBusyIndicator.Connect` is empty:** The method signature suggests it may be generated code (common in WPF for `IComponentConnector`), but the empty implementation has no documented purpose.
2. **Dictionary ordering assumption:** `CloseBusy` uses `busyParameters.Last().Value` to determine the next message to display. While .NET Framework 4.7+ and .NET Core preserve insertion order in `Dictionary`, this is not guaranteed by the interface contract. The "last" message may not be the most recently added in all runtime environments.
3. **No validation of `busyMessage`:** `ShowBusy` accepts any string, including `null` or empty strings, without validation.
4. **No exception handling for missing IDs in `CloseBusy`:** The method silently ignores calls to close non-existent IDs (it checks `ContainsKey` before removing).
5. **Message always updated on `ShowBusy`:** Even if an ID already exists with the same message, `Message` is reassigned and property change notification fires, which may trigger unnecessary UI updates.