protected override void Load(ContainerBuilder builder)
        {
            var viewModelAssembly = typeof(ShellViewModel).Assembly;
            var viewAssembly      = typeof(ShellView).Assembly;

            // Register Providers
            builder.RegisterType <VersionNumberProvider>().As <IVersionNumberProvider>().SingleInstance();
            builder.RegisterType <Elevation>().SingleInstance();
            builder.RegisterType <ChocolateyConfigurationProvider>().As <IChocolateyConfigurationProvider>().SingleInstance();
            builder.RegisterType <ChocolateyService>().As <IChocolateyService>().SingleInstance();
            builder.RegisterType <DotNetFileSystem>().As <chocolatey.infrastructure.filesystem.IFileSystem>().SingleInstance();
            builder.RegisterType <PackageArgumentsService>().As <IPackageArgumentsService>().SingleInstance();
            builder.RegisterType <DefaultEncryptionUtility>().As <IEncryptionUtility>().SingleInstance();

            // Register ViewModels
            builder.RegisterAssemblyTypes(viewModelAssembly)
            .Where(type => type.Name.EndsWith("ViewModel", StringComparison.Ordinal))
            .Where(type => type.GetInterface(typeof(INotifyPropertyChanged).Name) != null)
            .AsSelf()
            .InstancePerDependency();

            builder.RegisterType <PackageViewModel>().As <IPackageViewModel>();

            var choco = Lets.GetChocolatey(initializeLogging: true);

            builder.RegisterInstance(choco.Container().GetInstance <IChocolateyConfigSettingsService>())
            .As <IChocolateyConfigSettingsService>().SingleInstance();
            builder.RegisterInstance(choco.Container().GetInstance <IXmlService>())
            .As <IXmlService>().SingleInstance();

            // Register Views
            builder.RegisterAssemblyTypes(viewAssembly)
            .Where(type => type.Name.EndsWith("View", StringComparison.Ordinal))
            .AsSelf()
            .InstancePerDependency();

            // Register the single window manager for this container
            builder.Register <IWindowManager>(c => new WindowManager()).InstancePerLifetimeScope();

            // Register the single event aggregator for this container
            builder.Register <IEventAggregator>(c => new EventAggregator()).InstancePerLifetimeScope();

            // Register Services
            builder.RegisterType <DialogService>().As <IDialogService>().SingleInstance();
            builder.RegisterType <ProgressService>().As <IProgressService>().SingleInstance();
            builder.RegisterType <PersistenceService>().As <IPersistenceService>().SingleInstance();
            builder.RegisterType <LiteDBFileStorageService>().As <IFileStorageService>().SingleInstance();
            builder.RegisterType <ChocolateyGuiCacheService>().As <IChocolateyGuiCacheService>().SingleInstance();
            builder.RegisterType <AllowedCommandsService>().As <IAllowedCommandsService>().SingleInstance();

            // Register Mapper
            var mapperConfiguration = new MapperConfiguration(config =>
            {
                config.CreateMap <IPackageViewModel, IPackageViewModel>()
                .ForMember(vm => vm.IsInstalled, options => options.Ignore());

                config.CreateMap <DataServicePackage, Package>()
                .ForMember(dest => dest.Authors, opt => opt.MapFrom(src => src.Authors.Split(',')))
                .ForMember(dest => dest.Owners, opt => opt.MapFrom(src => src.Owners.Split(',')));
                config.CreateMap <IPackage, Package>();

                config.CreateMap <ConfigFileFeatureSetting, ChocolateyFeature>();
                config.CreateMap <ConfigFileConfigSetting, ChocolateySetting>();
                config.CreateMap <ConfigFileSourceSetting, Common.Models.ChocolateySource>()
                .ForMember(dest => dest.Password, opt => opt.MapFrom(src => NugetEncryptionUtility.DecryptString(src.Password)))
                .ForMember(dest => dest.CertificatePassword, opt => opt.MapFrom(src => NugetEncryptionUtility.DecryptString(src.CertificatePassword)));

                config.CreateMap <ChocolateySource, Common.Models.ChocolateySource>()
                .ForMember(dest => dest.VisibleToAdminsOnly, opt => opt.MapFrom(src => src.VisibleToAdminOnly));

                config.CreateMap <AdvancedInstallViewModel, AdvancedInstall>()
                .ForMember(
                    dest => dest.DownloadChecksum,
                    opt => opt.Condition(source => !source.IgnoreChecksums))
                .ForMember(
                    dest => dest.DownloadChecksumType,
                    opt => opt.Condition(source =>
                                         !source.IgnoreChecksums && !string.IsNullOrEmpty(source.DownloadChecksum)))
                .ForMember(
                    dest => dest.DownloadChecksum64bit,
                    opt => opt.Condition(source =>
                                         Environment.Is64BitOperatingSystem &&
                                         !source.IgnoreChecksums &&
                                         !source.Forcex86))
                .ForMember(
                    dest => dest.DownloadChecksumType64bit,
                    opt => opt.Condition(source =>
                                         Environment.Is64BitOperatingSystem &&
                                         !source.IgnoreChecksums &&
                                         !source.Forcex86 &&
                                         !string.IsNullOrEmpty(source.DownloadChecksum64bit)))
                .ForMember(
                    dest => dest.PackageParameters,
                    opt => opt.Condition(source => !source.SkipPowerShell))
                .ForMember(
                    dest => dest.InstallArguments,
                    opt => opt.Condition(source => !source.SkipPowerShell && !source.NotSilent));
            });

            builder.RegisterType <BundledThemeService>().As <IBundledThemeService>().SingleInstance();
            builder.RegisterInstance(mapperConfiguration.CreateMapper()).As <IMapper>();

            builder.Register(c => TranslationSource.Instance).SingleInstance();

            try
            {
                var userDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.LocalAppDataPath, "data.db")};upgrade=true");

                LiteDatabase globalDatabase;
                if (Hacks.IsElevated)
                {
                    globalDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};upgrade=true");
                }
                else
                {
                    if (!File.Exists(Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")))
                    {
                        // Since the global configuration database file doesn't exist, we must be running in a state where an administrator user
                        // has never run Chocolatey GUI. In this case, use null, which will mean attempts to use the global database will be ignored.
                        globalDatabase = null;
                    }
                    else
                    {
                        // Since this is a non-administrator user, they should only have read permissions to this database
                        globalDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};readonly=true");
                    }
                }

                if (globalDatabase != null)
                {
                    builder.RegisterInstance(globalDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.GlobalConfigurationDatabaseName);
                }

                var configService = new ConfigService(globalDatabase, userDatabase);
                configService.SetEffectiveConfiguration();

                var iconService = new PackageIconService(userDatabase);

                builder.RegisterInstance(iconService).As <IPackageIconService>().SingleInstance();
                builder.RegisterInstance(configService).As <IConfigService>().SingleInstance();
                builder.RegisterInstance(new LiteDBFileStorageService(userDatabase)).As <IFileStorageService>().SingleInstance();

                // Since there are two instances of LiteDB, they are added as named instances, so that they can be retrieved when required
                builder.RegisterInstance(userDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.UserConfigurationDatabaseName);
            }
            catch (IOException ex)
            {
                Bootstrapper.Logger.Error(ex, TranslationSource.Instance[nameof(Resources.Error_DatabaseAccessGui)]);
                throw;
            }

            builder.RegisterType <ImageService>().As <IImageService>().SingleInstance();
            builder.RegisterType <VersionService>().As <IVersionService>().SingleInstance();
            builder.RegisterType <SplashScreenService>().As <ISplashScreenService>().SingleInstance();
        }
Example #2
0
        protected override void Load(ContainerBuilder builder)
        {
            var viewModelAssembly = typeof(ShellViewModel).Assembly;
            var viewAssembly      = typeof(ShellView).Assembly;

            // Register Providers
            builder.RegisterType <VersionNumberProvider>().As <IVersionNumberProvider>().SingleInstance();
            builder.RegisterType <Elevation>().SingleInstance();
            builder.RegisterType <ChocolateyConfigurationProvider>().As <IChocolateyConfigurationProvider>().SingleInstance();
            builder.RegisterType <ChocolateyService>().As <IChocolateyService>().SingleInstance();
            builder.RegisterType <DotNetFileSystem>().As <chocolatey.infrastructure.filesystem.IFileSystem>().SingleInstance();

            // Register ViewModels
            builder.RegisterAssemblyTypes(viewModelAssembly)
            .Where(type => type.Name.EndsWith("ViewModel", StringComparison.Ordinal))
            .Where(type => type.GetInterface(typeof(INotifyPropertyChanged).Name) != null)
            .AsSelf()
            .InstancePerDependency();

            builder.RegisterType <PackageViewModel>().As <IPackageViewModel>();

            var choco = Lets.GetChocolatey();

            builder.RegisterInstance(choco.Container().GetInstance <IChocolateyConfigSettingsService>())
            .As <IChocolateyConfigSettingsService>().SingleInstance();
            builder.RegisterInstance(choco.Container().GetInstance <IXmlService>())
            .As <IXmlService>().SingleInstance();

            // Register Views
            builder.RegisterAssemblyTypes(viewAssembly)
            .Where(type => type.Name.EndsWith("View", StringComparison.Ordinal))
            .AsSelf()
            .InstancePerDependency();

            // Register the single window manager for this container
            builder.Register <IWindowManager>(c => new WindowManager()).InstancePerLifetimeScope();

            // Register the single event aggregator for this container
            builder.Register <IEventAggregator>(c => new EventAggregator()).InstancePerLifetimeScope();

            // Register Services
            builder.RegisterType <ProgressService>().As <IProgressService>().SingleInstance();
            builder.RegisterType <PersistenceService>().As <IPersistenceService>().SingleInstance();
            builder.RegisterType <LiteDBFileStorageService>().As <IFileStorageService>().SingleInstance();
            builder.RegisterType <ChocolateyGuiCacheService>().As <IChocolateyGuiCacheService>().SingleInstance();
            builder.RegisterType <AllowedCommandsService>().As <IAllowedCommandsService>().SingleInstance();

            // Register Mapper
            var mapperConfiguration = new MapperConfiguration(config =>
            {
                config.CreateMap <IPackageViewModel, IPackageViewModel>()
                .ForMember(vm => vm.IsInstalled, options => options.Ignore());

                config.CreateMap <DataServicePackage, Package>()
                .ForMember(dest => dest.Authors, opt => opt.MapFrom(src => src.Authors.Split(',')))
                .ForMember(dest => dest.Owners, opt => opt.MapFrom(src => src.Owners.Split(',')));
                config.CreateMap <IPackage, Package>();

                config.CreateMap <ConfigFileFeatureSetting, ChocolateyFeature>();
                config.CreateMap <ConfigFileConfigSetting, ChocolateySetting>();
                config.CreateMap <ConfigFileSourceSetting, Common.Models.ChocolateySource>()
                .ForMember(dest => dest.Password, opt => opt.MapFrom(src => NugetEncryptionUtility.DecryptString(src.Password)))
                .ForMember(dest => dest.CertificatePassword, opt => opt.MapFrom(src => NugetEncryptionUtility.DecryptString(src.CertificatePassword)));

                config.CreateMap <ChocolateySource, Common.Models.ChocolateySource>()
                .ForMember(dest => dest.VisibleToAdminsOnly, opt => opt.MapFrom(src => src.VisibleToAdminOnly));
            });

            builder.RegisterType <BundledThemeService>().As <IBundledThemeService>().SingleInstance();
            builder.RegisterInstance(DialogCoordinator.Instance).As <IDialogCoordinator>();
            builder.RegisterInstance(mapperConfiguration.CreateMapper()).As <IMapper>();

            try
            {
                var userDatabase = new LiteDatabase($"filename={Path.Combine(Bootstrapper.LocalAppDataPath, "data.db")};upgrade=true");

                LiteDatabase globalDatabase = null;

                globalDatabase = Hacks.IsElevated
                    ? new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};upgrade=true")
                    : new LiteDatabase($"filename={Path.Combine(Bootstrapper.AppDataPath, "Config", "data.db")};upgrade=true;readonly=true");

                var configService = new ConfigService(globalDatabase, userDatabase);
                configService.SetEffectiveConfiguration();

                var iconService = new PackageIconService(userDatabase);

                builder.RegisterInstance(iconService).As <IPackageIconService>().SingleInstance();
                builder.RegisterInstance(configService).As <IConfigService>().SingleInstance();
                builder.RegisterInstance(new LiteDBFileStorageService(userDatabase)).As <IFileStorageService>().SingleInstance();

                // Since there are two instances of LiteDB, they are added as named instances, so that they can be retrieved when required
                builder.RegisterInstance(userDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.UserConfigurationDatabaseName);
                builder.RegisterInstance(globalDatabase).As <LiteDatabase>().SingleInstance().Named <LiteDatabase>(Bootstrapper.GlobalConfigurationDatabaseName);
            }
            catch (IOException ex)
            {
                Bootstrapper.Logger.Error(ex, Resources.Error_DatabaseAccessGui);
                throw;
            }

            builder.RegisterType <ImageService>().As <IImageService>().SingleInstance();
            builder.RegisterType <VersionService>().As <IVersionService>().SingleInstance();
            builder.RegisterType <SplashScreenService>().As <ISplashScreenService>().SingleInstance();
        }