mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-29 15:11:53 +08:00
# Description DI companion models can share one address-space owner without depending on the Machinery server pipeline or creating another DeviceSet. This implements steps A-E of #4872. - Add `IDiModelProvider` and neutral model registration. DI-owning managers merge neutral providers with their family registrations, retain each instance once by reference identity, and preserve the original provider's type-name ordering through adapters. Robot Intent and Vision without Assets load only their family providers because they do not own DI. Vision's Assets dependency loader runs before neutral providers, including providers with `Order = int.MinValue`. - Add `AddDiModel<TProvider, TNodeManager>(configure)` with synchronous and awaited callbacks through the existing DI post-setup pipeline. Model registration is shared; callbacks target the selected manager type and run in registration order. Register Machinery configuration before dependent AutoID configuration. No registration-only AutoID/Machinery package is needed. The existing `OpcUaAutoIdCompositionExtensions.AddAutoIdToMachinery` API remains in the AutoID server assembly as an obsolete forwarder to `AddAutoIdModel`. - Centralize companion lifetime on `DiNodeManager`. Final shutdown atomically closes registration and joins pending drains before manager teardown, including their failures. Ordinary explicit drains permit later batches. Machinery rearms its cached cleanup bridge when adopting another machine-resource batch. - Add shared DeviceSet reachability and placement helpers. Runtime DI components link through the outermost composed component rather than each nested device. Public organization and notifier hooks replace companion friend-assembly access. Pumps and Scales resolve Machines through its generated model identifier; the protected compatibility helper remains namespace-qualified. - Consolidate composition examples, ordering, ownership and specification-based placement in the existing [Device Integration guide](docs/DeviceIntegration.md#composing-companion-models). Add summaries to the changed internal types and their public members. The generic helper and explicit callback ordering replace the earlier registration-only package design in response to review feedback. All thirteen review threads have a reply describing the published correction and are resolved. ### Validation The latest correction passed both affected net10.0 suites and the focused net48 regressions. Commands used `TEMP=TMP=D:\temp`, without warning demotions: ```powershell dotnet test tests\Opc.Ua.AutoID.Tests\Opc.Ua.AutoID.Tests.csproj -p:CustomTestTarget=net10.0 -f net10.0 -m:1 -p:BuildInParallel=false --logger trx --results-directory D:\temp\issue4872-feedback2-net10.0 -v quiet --no-restore # Passed 358; exit 0. dotnet test tests\Opc.Ua.Vision.Tests\Opc.Ua.Vision.Tests.csproj -p:CustomTestTarget=net10.0 -f net10.0 -m:1 -p:BuildInParallel=false --logger trx --results-directory D:\temp\issue4872-feedback2-net10.0 -v quiet --no-restore # Passed 713; one existing skip; exit 0. dotnet test tests\Opc.Ua.AutoID.Tests\Opc.Ua.AutoID.Tests.csproj -p:CustomTestTarget=net48 -f net48 -m:1 -p:BuildInParallel=false --logger trx --results-directory D:\temp\issue4872-feedback2-net48 -v quiet --filter 'FullyQualifiedName~LegacyMachineryRegistration' # Passed 2; exit 0. dotnet test tests\Opc.Ua.Vision.Tests\Opc.Ua.Vision.Tests.csproj -p:CustomTestTarget=net48 -f net48 -m:1 -p:BuildInParallel=false --logger trx --results-directory D:\temp\issue4872-feedback2-net48 -v quiet --filter 'FullyQualifiedName~VisionFactoriesLoadNeutralProvidersOnlyWhenOwningDiAsync|FullyQualifiedName~VisionAdaptersPreserveOriginalProviderTypeNameTies' # Passed 17; exit 0. ``` `LegacyMachineryRegistrationForwardsOptionsAndDeduplicatesTheNeutralModel` and `LegacyMachineryRegistrationPreservesNeutralValidation` cover the legacy entry point's options, provider deduplication, owner preservation and validation. `VisionFactoriesLoadNeutralProvidersOnlyWhenOwningDiAsync` includes four minimum-priority Assets cases across both factories and both registration orders. Full-solution validation remains incomplete. The earlier net10.0 attempt had a Windows clipboard access failure and stopped during Stress.Tests without a final result. The earlier net48 solution attempt failed because target assets were missing; the focused commands above restore successfully. Coverage percentages and current CI/CodeQL results were not collected locally. ## Related Issues Implements the proposal and maintainer answers in the tracking issue, with the generic helper and configuration order confirmed during review. - Fixes #4872 ## Checklist _Put an `x` in the boxes that apply. You can complete these step by step after opening the PR._ - [ ] I have signed the [CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf) and read the [CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md) doc. - [ ] I have added tests that prove my fix is effective or that my feature works and increased code coverage. - [x] I have added all necessary documentation. - [x] I have verified that my changes do not introduce (new) build or analyzer warnings. - [ ] I ran **all** tests locally using the **UA.slnx** solution against at least .net **framework** and .net **10**, and all passed. - [ ] I fixed **all** failing and flaky tests in the CI pipelines and **all** CodeQL warnings. - [x] I have addressed **all** PR feedback received.
Device Integration samples
| Folder | Contents |
|---|---|
| PumpDeviceIntegrationServer | A simulated pump line hosted by a Device Integration node manager, with OPC 40223 pump data, alarms, history, software-update simulation and OpenUSD assets. |
The sample's datasheet describes the simulated device. See Device Integration for the model and hosting APIs.
Run
From the repository root:
dotnet run --project samples\Di\PumpDeviceIntegrationServer\PumpDeviceIntegrationServer.csproj -f net10.0
See the sample README for endpoint, certificate and simulation options.