using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace TINK.Services
{
/// Container of service objects (locks , geolocation, ...) where one service is active.
/// All service objects must be of different type.
public class ServicesContainerMutable: IEnumerable, INotifyPropertyChanged, IServicesContainer
{
private readonly Dictionary serviceDict;
public event PropertyChangedEventHandler PropertyChanged;
/// Constructs object on startup of app.
/// Fixed list of service- objects .
/// LocksService name which is activated on startup of app.
public ServicesContainerMutable(
IEnumerable 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];
}
/// Active locks service.
public T Active { get; private set; }
/// Sets a lock service as active locks service by name.
/// Name of the new locks service.
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 GetEnumerator()
=> serviceDict.Values.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator()
=> serviceDict.Values.GetEnumerator();
}
}