/// <summary>
        ///     Creates an instance of <see cref="ICodeBasedDiContainerConfigurator" /> for code based dependency injection
        ///     configuration.
        /// </summary>
        /// <param name="diManager">An instance of <see cref="IDiManager" /></param>
        /// <param name="entryAssemblyFolder">The entry assembly folder.</param>
        /// <param name="assemblyProbingPaths">The assembly probing paths.</param>
        /// <exception cref="ConfigurationParseException">Throws this exception if configuration parse/load fails.</exception>
        /// <exception cref="LoggerWasNotInitializedException"></exception>
        /// <exception cref="OROptimizer.DynamicCode.DynamicCodeGenerationException">Throws this exception if dynamic code generation fails.</exception>
        /// <exception cref="Exception">Throws this exception.</exception>
        public ICodeBasedDiContainerConfigurator StartCodeBasedDi([NotNull] IDiManager diManager,
                                                                  [NotNull] string entryAssemblyFolder,
                                                                  [CanBeNull][ItemNotNull] params string[] assemblyProbingPaths)
        {
            if (!LogHelper.IsContextInitialized)
            {
                throw new LoggerWasNotInitializedException();
            }

            var configuration = new CodeBasedConfiguration(diManager, entryAssemblyFolder, assemblyProbingPaths);

            configuration.Init();
            return(new CodeBasedDiContainerConfigurator(configuration));
        }
        /// <summary>
        ///     Creates an instance of <see cref="ICodeBasedDiContainerConfigurator" /> for code based dependency injection
        ///     configuration.
        /// </summary>
        /// <param name="diManagerClassFullName">Should be a full name of a class that implements <see cref="IDiManager" />.</param>
        /// <param name="diManagerClassAssemblyFilePath">
        ///     Full path of assembly, containing the class specified parameter
        ///     <paramref name="diManagerClassFullName" />.
        /// </param>
        /// <param name="diManagerConstructorParameters">
        ///     Collection of constructor parameter type/value combinations to be passed to a constructor in class specified
        ///     in parameter <paramref name="diManagerClassFullName" />.
        /// </param>
        /// <param name="entryAssemblyFolder">The entry assembly folder.</param>
        /// <param name="assemblyProbingPaths">Additional assembly probing paths.</param>
        /// <exception cref="ConfigurationParseException">Throws this exception if configuration parse/load fails.</exception>
        /// <exception cref="LoggerWasNotInitializedException"></exception>
        /// <exception cref="OROptimizer.DynamicCode.DynamicCodeGenerationException">Throws this exception if dynamic code generation fails.</exception>
        /// <exception cref="Exception">Throws this exception.</exception>
        public ICodeBasedDiContainerConfigurator StartCodeBasedDi([NotNull] string diManagerClassFullName,
                                                                  [NotNull] string diManagerClassAssemblyFilePath,
                                                                  [CanBeNull][ItemNotNull] ParameterInfo[] diManagerConstructorParameters,
                                                                  [NotNull] string entryAssemblyFolder,
                                                                  [CanBeNull][ItemNotNull] params string[] assemblyProbingPaths)
        {
            if (!LogHelper.IsContextInitialized)
            {
                throw new LoggerWasNotInitializedException();
            }

            var configuration = new CodeBasedConfiguration(diManagerClassFullName, diManagerClassAssemblyFilePath, diManagerConstructorParameters, entryAssemblyFolder, assemblyProbingPaths);

            configuration.Init();
            return(new CodeBasedDiContainerConfigurator(configuration));
        }