/// <summary>
 /// Registers <typeparamref name="TFactory"/> to be factory for singleton service of type <typeparamref name="TInterface"/>.
 /// </summary>
 /// <typeparam name="TInterface">A type of the contract.</typeparam>
 /// <typeparam name="TFactory">A type of the factory.</typeparam>
 /// <param name="collection">A collection dependencies.</param>
 /// <returns><paramref name="collection"/>.</returns>
 public static IDependencyDefinitionCollection AddSingletonFactory <TInterface, TFactory>(this IDependencyDefinitionCollection collection)
     where TFactory : IFactory <TInterface>
 {
     Ensure.NotNull(collection, "collection");
     collection.Add(typeof(TInterface), DependencyLifetime.NameScope(collection.ScopeName), typeof(TFactory));
     return(collection);
 }
 /// <summary>
 /// Maps <typeparamref name="TInterface"/> to <typeparamref name="TImplementation"/> in current scope (as a singleton).
 /// </summary>
 /// <typeparam name="TInterface">A type of the contract.</typeparam>
 /// <typeparam name="TImplementation">A type of the implementation.</typeparam>
 /// <param name="collection">A collection of dependencies.</param>
 /// <returns><paramref name="collection"/>.</returns>
 public static IDependencyDefinitionCollection AddSingleton <TInterface, TImplementation>(this IDependencyDefinitionCollection collection)
     where TImplementation : TInterface
 {
     Ensure.NotNull(collection, "collection");
     collection.Add(typeof(TInterface), DependencyLifetime.NameScope(collection.ScopeName), typeof(TImplementation));
     return(collection);
 }
        private SimpleDependencyContainer(string scopeName, SimpleDependencyContainer parentContainer)
        {
            Ensure.NotNullOrEmpty(scopeName, "scopeName");
            this.scopeName       = scopeName;
            this.parentContainer = parentContainer;

            InstanceStorage instances = new InstanceStorage();

            if (parentContainer == null)
            {
                this.definitions = new DependencyDefinitionCollection(scopeName, instances);
            }
            else
            {
                this.definitions = new DependencyDefinitionCollection(scopeName, instances, parentContainer.definitions);
            }

            this.resolver = new InstanceResolver(definitions, instances);

            definitions.Add(typeof(IDependencyContainer), DependencyLifetime.NameScope(scopeName), this);
            definitions.Add(typeof(IDependencyProvider), DependencyLifetime.NameScope(scopeName), this);
        }
 /// <summary>
 /// Registers <typeparamref name="TImplementation"/> as a singleton <paramref name="instance"/> in current scope.
 /// </summary>
 /// <typeparam name="TImplementation">A type of the service.</typeparam>
 /// <param name="collection">A collection dependencies.</param>
 /// <param name="instance">An instance to be used.</param>
 /// <returns><paramref name="collection"/>.</returns>
 public static IDependencyDefinitionCollection AddSingleton <TImplementation>(this IDependencyDefinitionCollection collection, TImplementation instance)
 {
     Ensure.NotNull(collection, "collection");
     collection.Add(typeof(TImplementation), DependencyLifetime.NameScope(collection.ScopeName), instance);
     return(collection);
 }
 /// <summary>
 /// Registers <typeparamref name="TImplementation"/> as a singleton service in scope named <paramref name="scopeName"/>.
 /// </summary>
 /// <typeparam name="TImplementation">A type of the service.</typeparam>
 /// <param name="collection">A collection dependencies.</param>
 /// <param name="scopeName">A na of the scope where service will be available.</param>
 /// <returns><paramref name="collection"/>.</returns>
 public static IDependencyDefinitionCollection AddScoped <TImplementation>(this IDependencyDefinitionCollection collection, string scopeName)
 {
     Ensure.NotNull(collection, "collection");
     collection.Add(typeof(TImplementation), DependencyLifetime.NameScope(scopeName), typeof(TImplementation));
     return(collection);
 }