using Microsoft.Extensions.DependencyInjection; using System.IO.Ports; namespace Toolkit.Foundation; public class SerialContextFactory(IServiceProvider provider, IServiceFactory factory) : ISerialContextFactory { private readonly Dictionary cache = []; public ISerialContext? Create() where TConfiguration : ISerialConfiguration where TReader : SerialReader where TEvent : SerialEventArgs, new() { if (provider.GetRequiredService() is TConfiguration configuration) { if (cache.TryGetValue(configuration, out ISerialContext? context)) { return (ISerialContext)context; } SerialPort serialPort = new(configuration.PortName, configuration.BaudRate) { ReadTimeout = SerialPort.InfiniteTimeout, WriteTimeout = SerialPort.InfiniteTimeout, DtrEnable = false, RtsEnable = false }; SerialConnection connection = new(serialPort); SerialStreamer streamer = new(serialPort); context = factory.Create>(connection, streamer); cache.Add(configuration, context); return (ISerialContext)context; } return default; } }