You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
2.5 KiB
60 lines
2.5 KiB
using MultiTerm.Core.Types;
|
|
using MultiTerm.Core.ViewModel;
|
|
using MultiTerm.Protocols.Factories;
|
|
using MultiTerm.Protocols.Types;
|
|
|
|
namespace MultiTerm.Core.Factories;
|
|
|
|
/// <summary>
|
|
/// Can create <see cref="ITerminalViewModel"/> instances during runtime.
|
|
/// </summary>
|
|
public class TerminalViewModelFactory : ITerminalViewModelFactory
|
|
{
|
|
private readonly Func<IEnumerable<ITerminalViewModel>> factory;
|
|
private readonly ICommunicationProtocolFactory communicationProtocolFactory;
|
|
|
|
/// <summary>
|
|
/// Constructor of <see cref="TerminalViewModelFactory"/>.
|
|
/// </summary>
|
|
/// <param name="factory">function that gets all registered services with Interface <see cref="ITerminalViewModel"/></param>
|
|
public TerminalViewModelFactory(Func<IEnumerable<ITerminalViewModel>> factory, ICommunicationProtocolFactory communicationProtocolFactory)
|
|
{
|
|
this.factory = factory;
|
|
this.communicationProtocolFactory = communicationProtocolFactory;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new <see cref="ITerminalViewModel"/>.
|
|
/// </summary>
|
|
/// <param name="viewType"><see cref="TerminalViewType"/> of the new <see cref="ITerminalViewModel"/>. Must be set at creation time for all <see cref="ITerminalViewModel"/></param>
|
|
/// <param name="protocolType"><see cref="ProtocolType"/> of the new <see cref="ITerminalViewModel"/></param>
|
|
/// <returns></returns>
|
|
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;
|
|
}
|
|
}
|
|
|