using System.Collections.Immutable; using Demo.Models; namespace Demo.Features; public class FeatureContainer : IFeatureContainer { private readonly IDictionary _payloads; private static readonly Lazy _lazy = new Lazy(() => new FeatureContainer()); private FeatureContainer() { _payloads = new Dictionary(); } public static FeatureContainer Instance => _lazy.Value; public IFeatureContainer RegisterFeature(string signId, Feature feature) { if (_payloads.TryGetValue(signId, out var features)) { features.TryAdd(feature.Name, feature); } else { _payloads.TryAdd(signId, new FeatureList() { { feature.Name, feature } }); } return this; } public IFeatureContainer RegisterWrapper(Func wrapper) { _wrapper = wrapper; return this; } private Func? _wrapper; public IFeatureWrapper BuildWrapper(IMetadata metadata) { if (_payloads.TryGetValue(metadata.SignId, out var features)) { return _wrapper?.Invoke(metadata, features) ?? new FeatureWrapper(metadata, features); } return new FeatureWrapper(metadata, features); } }