namespace Swan.DependencyInjection { using System; using System.Collections.Generic; using System.Linq; /// /// Registration options for "fluent" API. /// public sealed class RegisterOptions { private readonly TypesConcurrentDictionary _registeredTypes; private readonly DependencyContainer.TypeRegistration _registration; /// /// Initializes a new instance of the class. /// /// The registered types. /// The registration. public RegisterOptions(TypesConcurrentDictionary registeredTypes, DependencyContainer.TypeRegistration registration) { _registeredTypes = registeredTypes; _registration = registration; } /// /// Make registration a singleton (single instance) if possible. /// /// A registration options for fluent API. /// Generic constraint registration exception. public RegisterOptions AsSingleton() { var currentFactory = _registeredTypes.GetCurrentFactory(_registration); if (currentFactory == null) throw new DependencyContainerRegistrationException(_registration.Type, "singleton"); return _registeredTypes.AddUpdateRegistration(_registration, currentFactory.SingletonVariant); } /// /// Make registration multi-instance if possible. /// /// A registration options for fluent API. /// Generic constraint registration exception. public RegisterOptions AsMultiInstance() { var currentFactory = _registeredTypes.GetCurrentFactory(_registration); if (currentFactory == null) throw new DependencyContainerRegistrationException(_registration.Type, "multi-instance"); return _registeredTypes.AddUpdateRegistration(_registration, currentFactory.MultiInstanceVariant); } /// /// Make registration hold a weak reference if possible. /// /// A registration options for fluent API. /// Generic constraint registration exception. public RegisterOptions WithWeakReference() { var currentFactory = _registeredTypes.GetCurrentFactory(_registration); if (currentFactory == null) throw new DependencyContainerRegistrationException(_registration.Type, "weak reference"); return _registeredTypes.AddUpdateRegistration(_registration, currentFactory.WeakReferenceVariant); } /// /// Make registration hold a strong reference if possible. /// /// A registration options for fluent API. /// Generic constraint registration exception. public RegisterOptions WithStrongReference() { var currentFactory = _registeredTypes.GetCurrentFactory(_registration); if (currentFactory == null) throw new DependencyContainerRegistrationException(_registration.Type, "strong reference"); return _registeredTypes.AddUpdateRegistration(_registration, currentFactory.StrongReferenceVariant); } } /// /// Registration options for "fluent" API when registering multiple implementations. /// public sealed class MultiRegisterOptions { private IEnumerable _registerOptions; /// /// Initializes a new instance of the class. /// /// The register options. public MultiRegisterOptions(IEnumerable registerOptions) { _registerOptions = registerOptions; } /// /// Make registration a singleton (single instance) if possible. /// /// A registration multi-instance for fluent API. /// Generic Constraint Registration Exception. public MultiRegisterOptions AsSingleton() { _registerOptions = ExecuteOnAllRegisterOptions(ro => ro.AsSingleton()); return this; } /// /// Make registration multi-instance if possible. /// /// A registration multi-instance for fluent API. /// Generic Constraint Registration Exception. public MultiRegisterOptions AsMultiInstance() { _registerOptions = ExecuteOnAllRegisterOptions(ro => ro.AsMultiInstance()); return this; } private IEnumerable ExecuteOnAllRegisterOptions( Func action) { return _registerOptions.Select(action).ToList(); } } }