From 1d90bf3611d54cb60b931286798e42533bf0e96f Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 24 Jul 2026 14:08:10 -0400 Subject: [PATCH] feat(modbus-rtu): add ModbusTransportFactory switch on Transport mode Claude-Session: https://claude.ai/code/session_01GASWkNEi68FSCtvr6rLoEW --- .../ModbusTransportFactory.cs | 37 +++++++++++++++++++ .../ModbusTransportFactoryTests.cs | 22 +++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs create mode 100644 tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs diff --git a/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs new file mode 100644 index 00000000..88827a8e --- /dev/null +++ b/src/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus/ModbusTransportFactory.cs @@ -0,0 +1,37 @@ +namespace ZB.MOM.WW.OtOpcUa.Driver.Modbus; + +/// +/// Single mapping point from to the concrete +/// its selects. +/// Consumed by both 's default transport-factory closure and the +/// AdminUI Test-Connect probe, so the switch lives in +/// exactly one place. +/// +public static class ModbusTransportFactory +{ + /// + /// Builds the transport . + /// selects, threading every shared connection setting (Host/Port/Timeout/AutoReconnect/ + /// KeepAlive/IdleDisconnectTimeout/Reconnect) through to whichever concrete transport is built. + /// + /// Driver configuration options. + /// A when + /// is selected; otherwise a (also the default/unrecognized fallback). + public static IModbusTransport Create(ModbusDriverOptions options) + { + ArgumentNullException.ThrowIfNull(options); + return options.Transport switch + { + ModbusTransportMode.RtuOverTcp => new ModbusRtuOverTcpTransport( + options.Host, options.Port, options.Timeout, options.AutoReconnect, + keepAlive: options.KeepAlive, + idleDisconnect: options.IdleDisconnectTimeout, + reconnect: options.Reconnect), + _ => new ModbusTcpTransport( + options.Host, options.Port, options.Timeout, options.AutoReconnect, + keepAlive: options.KeepAlive, + idleDisconnect: options.IdleDisconnectTimeout, + reconnect: options.Reconnect), + }; + } +} diff --git a/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs b/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs new file mode 100644 index 00000000..5644998f --- /dev/null +++ b/tests/Drivers/ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests/ModbusTransportFactoryTests.cs @@ -0,0 +1,22 @@ +using Shouldly; +using Xunit; + +namespace ZB.MOM.WW.OtOpcUa.Driver.Modbus.Tests; + +public sealed class ModbusTransportFactoryTests +{ + [Fact] + public void Tcp_mode_builds_tcp_transport() + => ModbusTransportFactory.Create(new ModbusDriverOptions { Transport = ModbusTransportMode.Tcp }) + .ShouldBeOfType(); + + [Fact] + public void RtuOverTcp_mode_builds_rtu_transport() + => ModbusTransportFactory.Create(new ModbusDriverOptions { Transport = ModbusTransportMode.RtuOverTcp }) + .ShouldBeOfType(); + + [Fact] + public void Default_options_build_tcp_transport() + => ModbusTransportFactory.Create(new ModbusDriverOptions()) + .ShouldBeOfType(); +}