sharee.bike-App/TINKLib/Services/ServicesContainerMutable.cs
2021-05-13 20:03:07 +02:00

57 lines
2.2 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace TINK.Services
{
/// <summary> Container of service objects (locks , geolocation, ...) where one service is active. </summary>
/// <remarks> All service objects must be of different type. </remarks>
public class ServicesContainerMutable<T>: IEnumerable<T>, INotifyPropertyChanged
{
private readonly Dictionary<string, T> serviceDict;
public event PropertyChangedEventHandler PropertyChanged;
/// <summary> Constructs object on startup of app.</summary>
/// <param name="services">Fixed list of service- objects .</param>
/// <param name="activeName">LocksService name which is activated on startup of app.</param>
public ServicesContainerMutable(
IEnumerable<T> services,
string activeName)
{
serviceDict = services.Distinct().ToDictionary(x => x.GetType().FullName);
if (!serviceDict.ContainsKey(activeName))
{
throw new ArgumentException($"Can not instantiate {typeof(T).Name}- object. Active lock service {activeName} must be contained in [{String.Join(",", serviceDict)}].");
}
Active = serviceDict[activeName];
}
/// <summary> Active locks service.</summary>
public T Active { get; private set; }
/// <summary> Sets a lock service as active locks service by name. </summary>
/// <param name="active">Name of the new locks service.</param>
public void SetActive(string active)
{
if (!serviceDict.ContainsKey(active))
{
throw new ArgumentException($"Can not set active lock service {active}. Service must be contained in [{String.Join(",", serviceDict)}].");
}
Active = serviceDict[active];
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Active)));
}
public IEnumerator<T> GetEnumerator()
=> serviceDict.Values.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator()
=> serviceDict.Values.GetEnumerator();
}
}