using MultiTerm.Core.Types; using MultiTerm.Core.ViewModel; using MultiTerm.Protocols.Factories; using MultiTerm.Protocols.Types; namespace MultiTerm.Core.Factories; /// /// Can create instances during runtime. /// public class TerminalViewModelFactory : ITerminalViewModelFactory { private readonly Func> factory; private readonly ICommunicationProtocolFactory communicationProtocolFactory; /// /// Constructor of . /// /// function that gets all registered services with Interface public TerminalViewModelFactory(Func> factory, ICommunicationProtocolFactory communicationProtocolFactory) { this.factory = factory; this.communicationProtocolFactory = communicationProtocolFactory; } /// /// Creates a new . /// /// of the new . Must be set at creation time for all /// of the new /// public ITerminalViewModel Create(TerminalViewType viewType, ProtocolType protocolType) { ITerminalViewModel output; // get all registered TerminalViewModels as IEnumerable var registeredViewModels = factory(); // search for correct type by ViewType which must be set in constructor of all TerminalViewModel Types try { output = registeredViewModels.Where(x => x.ViewType == viewType).First(); } catch (Exception ex) { throw new NotImplementedException($"'{nameof(TerminalViewModelFactory)}' cannot create Terminal with {nameof(TerminalViewType)} {viewType}", ex); } // immediately initialize protocol type output.ProtocolType = protocolType; // create communication protocol instances var createdComProtocol = this.communicationProtocolFactory.Create(protocolType); output.CommunicationProtocol = createdComProtocol.Item1; output.ProtocolSettings = createdComProtocol.Item2; // return the filled up instance return output; } }