internal PlusApplicationBase(
            [NotNull] Type startupModuleType,
            [NotNull] IServiceCollection services,
            [CanBeNull] Action <PlusApplicationCreationOptions> optionsAction)
        {
            Check.NotNull(startupModuleType, nameof(startupModuleType));
            Check.NotNull(services, nameof(services));

            StartupModuleType = startupModuleType;
            Services          = services;

            services.TryAddObjectAccessor <IServiceProvider>();

            var options = new PlusApplicationCreationOptions(services);

            optionsAction?.Invoke(options);

            services.AddSingleton <IPlusApplication>(this);
            services.AddSingleton <IModuleContainer>(this);

            services.AddCoreServices();
            services.AddCorePlusServices(this, options);

            Modules = LoadModules(services, options);
            ConfigureServices();
        }
        public static void UseAutofac(this PlusApplicationCreationOptions options)
        {
            var builder = new ContainerBuilder();

            options.Services.AddObjectAccessor(builder);
            options.Services.AddSingleton((IServiceProviderFactory <ContainerBuilder>) new PlusAutofacServiceProviderFactory(builder));
        }
 protected virtual IReadOnlyList <IPlusModuleDescriptor> LoadModules(IServiceCollection services, PlusApplicationCreationOptions options)
 {
     return(services
            .GetSingletonInstance <IModuleLoader>()
            .LoadModules(
                services,
                StartupModuleType,
                options.PlugInSources
                ));
 }