Part of #753.
Goal
Migrate the shared Opc.Ua.Sample library node managers (used by the WinForms Sample Server and others) to AsyncCustomNodeManager, and adopt source generation / FluentNodeManager where a generated model exists.
Scope
Samples/Opc.Ua.Sample/TestData/TestDataNodeManager.cs — TestDataNodeManager : CustomNodeManager2 (generated TestData model)
Samples/Opc.Ua.Sample/Boiler/BoilerNodeManager.cs — BoilerNodeManager : SampleNodeManager (generated Boiler model)
Samples/Opc.Ua.Sample/MemoryBuffer/MemoryBufferNodeManager.cs — MemoryBufferNodeManager : SampleNodeManager (hand-built)
- Local base classes:
Samples/Opc.Ua.Sample/Base/CustomNodeManager.cs (local CustomNodeManager2), Samples/Opc.Ua.Sample/Base/SampleNodeManager.cs
Samples/Opc.Ua.Sample/Opc.Ua.Sample.csproj (already references the source generator)
Because these managers derive from local base classes bundled in this project, decide up front whether to (a) retire the local CustomNodeManager2/SampleNodeManager in favor of the library AsyncCustomNodeManager, or (b) keep thin local shims. Prefer (a).
Step 1 — AsyncCustomNodeManager (all three managers)
- Rebase each manager onto the library
AsyncCustomNodeManager; constructor base(server, configuration, <namespaceUri>).
CreateAddressSpace → override async ValueTask CreateAddressSpaceAsync(...); LoadPredefinedNodes → LoadPredefinedNodesAsync.
- Convert method/read/write callbacks to async handlers; TestData's system-callback simulation should push updates via
await ClearChangeMasksAsync. MemoryBuffer: convert the buffer scan/update path to the async monitored-item/notification path.
- Remove
lock (Lock) blocks — use base async locking.
- Register via
IAsyncNodeManagerFactory; update Samples/Server.Net4 (UA Sample Server) startup accordingly.
Step 2 — FluentNodeManager (generated models: TestData, Boiler)
- Opt in to generated node managers for the TestData and Boiler designs via
[NodeManager] / MSBuild flag; use the generated LoadPredefinedNodesAsync.
- Move callbacks into
partial void Configure(INodeManagerBuilder builder); delete redundant hand-written address-space code. (MemoryBuffer stays a hand-written AsyncCustomNodeManager.)
Acceptance criteria
TestDataNodeManager, BoilerNodeManager, MemoryBufferNodeManager all derive from AsyncCustomNodeManager; local sync base classes are removed or reduced to non-conflicting helpers; no lock (Lock) remains.
Opc.Ua.Sample builds; the UA Sample Server (Samples/Server.Net4) starts; a client browses/reads/writes/subscribes across TestData, Boiler and MemoryBuffer, and TestData method calls succeed.
References
docs/AsyncServerSupport.md, docs/NodeManagers.md (UA-.NETStandard).
Part of #753.
Goal
Migrate the shared
Opc.Ua.Samplelibrary node managers (used by the WinForms Sample Server and others) toAsyncCustomNodeManager, and adopt source generation /FluentNodeManagerwhere a generated model exists.Scope
Samples/Opc.Ua.Sample/TestData/TestDataNodeManager.cs—TestDataNodeManager : CustomNodeManager2(generated TestData model)Samples/Opc.Ua.Sample/Boiler/BoilerNodeManager.cs—BoilerNodeManager : SampleNodeManager(generated Boiler model)Samples/Opc.Ua.Sample/MemoryBuffer/MemoryBufferNodeManager.cs—MemoryBufferNodeManager : SampleNodeManager(hand-built)Samples/Opc.Ua.Sample/Base/CustomNodeManager.cs(localCustomNodeManager2),Samples/Opc.Ua.Sample/Base/SampleNodeManager.csSamples/Opc.Ua.Sample/Opc.Ua.Sample.csproj(already references the source generator)Because these managers derive from local base classes bundled in this project, decide up front whether to (a) retire the local
CustomNodeManager2/SampleNodeManagerin favor of the libraryAsyncCustomNodeManager, or (b) keep thin local shims. Prefer (a).Step 1 — AsyncCustomNodeManager (all three managers)
AsyncCustomNodeManager; constructorbase(server, configuration, <namespaceUri>).CreateAddressSpace→override async ValueTask CreateAddressSpaceAsync(...);LoadPredefinedNodes→LoadPredefinedNodesAsync.await ClearChangeMasksAsync. MemoryBuffer: convert the buffer scan/update path to the async monitored-item/notification path.lock (Lock)blocks — use base async locking.IAsyncNodeManagerFactory; updateSamples/Server.Net4(UA Sample Server) startup accordingly.Step 2 — FluentNodeManager (generated models: TestData, Boiler)
[NodeManager]/ MSBuild flag; use the generatedLoadPredefinedNodesAsync.partial void Configure(INodeManagerBuilder builder); delete redundant hand-written address-space code. (MemoryBuffer stays a hand-writtenAsyncCustomNodeManager.)Acceptance criteria
TestDataNodeManager,BoilerNodeManager,MemoryBufferNodeManagerall derive fromAsyncCustomNodeManager; local sync base classes are removed or reduced to non-conflicting helpers; nolock (Lock)remains.Opc.Ua.Samplebuilds; the UA Sample Server (Samples/Server.Net4) starts; a client browses/reads/writes/subscribes across TestData, Boiler and MemoryBuffer, and TestData method calls succeed.References
docs/AsyncServerSupport.md,docs/NodeManagers.md(UA-.NETStandard).