Multiprocotol Terminalprogram (BAT)
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.
MultiTerm/MultiTerm.Protocols/Factories/CommunicationProtocolFactor...

73 lines
3.4 KiB

using MultiTerm.Protocols.Types;
namespace MultiTerm.Protocols.Factories;
/// <summary>
/// Can create <see cref="ICommunicationProtocol"/> instances during runtime.
/// </summary>
public class CommunicationProtocolFactory : ICommunicationProtocolFactory
{
private readonly Func<IEnumerable<ICommunicationProtocol>> protocolFactory;
private readonly Func<IEnumerable<IProtocolSettingsViewModel>> settingsViewModelFactory;
/// <summary>
/// Constructor of <see cref="CommunicationProtocolFactory"/>.
/// </summary>
/// <param name="protocolFactory">function that gets all registered services with Interface <see cref="ICommunicationProtocol"/></param>
/// <param name="settingsViewModelFactory">function that gets all registered services with Interface <see cref="IProtocolSettingsViewModel"/></param>
public CommunicationProtocolFactory(Func<IEnumerable<ICommunicationProtocol>> protocolFactory, Func<IEnumerable<IProtocolSettingsViewModel>> settingsViewModelFactory)
{
this.protocolFactory = protocolFactory;
this.settingsViewModelFactory = settingsViewModelFactory;
}
/// <summary>
/// Creates a new <see cref="ICommunicationProtocol"/> and its corresponding <see cref="IProtocolSettingsViewModel"/>.
/// </summary>
/// <param name="protocolType"><see cref="ProtocolType"/> of the new <see cref="ICommunicationProtocol"/></param>
/// <returns>tuple of communication protocol and protocol settings viewmodel</returns>
public Tuple<ICommunicationProtocol, IProtocolSettingsViewModel> Create(ProtocolType protocolType)
{
ICommunicationProtocol protocol;
IProtocolSettingsViewModel settingsViewModel;
// get all registered ICommunicationProtocol as IEnumerable
var registeredProtocols = protocolFactory();
// get all registered IProtocolSettingsViewModel as IEnumerable
var registeredSettingsViewModel = settingsViewModelFactory();
// search for correct type of protocol implementation by ProtocolType
try
{
protocol = registeredProtocols.Where(x => x.ProtocolType == protocolType).First();
}
catch (Exception ex)
{
throw new NotImplementedException($"'{nameof(CommunicationProtocolFactory)}' cannot create " +
$"CommunicationProtocol with {nameof(ProtocolType)} {protocolType}", ex);
}
// search for correct type of settings View Model implementation by ProtocolType
try
{
settingsViewModel = registeredSettingsViewModel.Where(x => x.ProtocolType == protocolType).First();
}
catch (Exception ex)
{
throw new NotImplementedException($"'{nameof(CommunicationProtocolFactory)}' cannot create " +
$"ProtocolSettingsViewModel with {nameof(ProtocolType)} {protocolType}", ex);
}
// check if settings viewmodel also implements IProtocolSettings, which it must
if(settingsViewModel is not IProtocolSettings)
{
throw new NotImplementedException($"'{nameof(CommunicationProtocolFactory)}' cannot create " +
$"CommunicationProtocol since {settingsViewModel.GetType()} does not implement {nameof(IProtocolSettings)}.");
}
// return the filled up instances
return new Tuple<ICommunicationProtocol, IProtocolSettingsViewModel>(protocol, settingsViewModel);
}
}