public async Task InitializationAsync(IServiceCollection services, IConfiguration configuration)
        {
            var server       = configuration["Connection:Server"];
            var databaseName = configuration["Connection:DatabaseName"];
            var userName     = configuration["Connection:UserName"] ?? string.Empty;
            var password     = configuration["Connection:Password"] ?? string.Empty;

            var stringProvider = new SqlServerConnectionStringProvider();

            if (string.IsNullOrWhiteSpace(server) || string.IsNullOrWhiteSpace(databaseName))
            {
                throw new DatabaseNotConfiguredException("Server or database not found");
            }
            else
            {
                stringProvider.Server       = server;
                stringProvider.DatabaseName = databaseName;
            }

            stringProvider.AuthenticationType = string.IsNullOrWhiteSpace(userName) ? AuthenticationType.Windows : AuthenticationType.MSSQLServer;
            stringProvider.Username           = userName;
            stringProvider.Password           = password;

            services.AddSingleton(stringProvider);
            services.AddDbContext <ApplicationDbContext>();
            services.AddIdentity <User, IdentityRole>()
            .AddUserManager <UserIdentityManager>()
            .AddEntityFrameworkStores <ApplicationDbContext>();

            var connectionFactory   = new SqlServerConnectionFactory(stringProvider);
            var dataStorageProvider = new SqlServerDatabaseStorageProvider(
                connectionFactory,
                new SqlServerDatabaseStatusProvider(connectionFactory),
                new SqlServerDatabaseInfoProvider(connectionFactory),
                new SqlServerDatabaseStorageInfoProvider(connectionFactory));
            var repFactory = new RepositoryFactory(new SqlServerDatabaseStorageService(dataStorageProvider));

            services.AddSingleton(repFactory);
            services.AddScoped <UserBlockerService>();

            using (var context = new ApplicationDbContext(stringProvider))
            {
                var isCreated = await context.Database
                                .EnsureCreatedAsync()
                                .ConfigureAwait(continueOnCapturedContext: false);
            }

            var serviceProvider = services.BuildServiceProvider();
            var userManager     = serviceProvider.GetService <UserIdentityManager>();

            var rolesRep = repFactory.CreateRoles();
            var roles    = await rolesRep.CreateDefaultsAsync()
                           .ConfigureAwait(continueOnCapturedContext: false);

            var systemUser = new User
            {
                Email    = AdminChecker.AdminName,
                UserName = AdminChecker.AdminName,
            };
            var userExists = await userManager.FindByEmailAsync(systemUser.Email)
                             .ConfigureAwait(continueOnCapturedContext: false);

            if (userExists == null)
            {
                var systemUserResult = await userManager.CreateAsync(systemUser)
                                       .ConfigureAwait(continueOnCapturedContext: false);

                await userManager.AddPasswordAsync(systemUser, "admin")
                .ConfigureAwait(continueOnCapturedContext: false);

                var userReferences = repFactory.CreateUsers();
                var roleFilter     = new RoleFilter(RoleType.Admin);
                var role           = roles.FirstOrDefault(roleFilter.Predicate);
                await userReferences.AddAsync(new UserReferenceData(systemUser.Id, role))
                .ConfigureAwait(continueOnCapturedContext: false);
            }
        }
 public SqlServerDatabaseStorageService(SqlServerDatabaseStorageProvider storageProvider)
 {
     StorageProvider = storageProvider;
 }