Ejemplo n.º 1
0
 /// <summary>
 /// Adds custom factory required for translation of custom methods like <see cref="RelationalQueryableExtensions.AsSubQuery{TEntity}"/>.
 /// </summary>
 /// <param name="builder">Options builder.</param>
 /// <param name="addCustomQueryableMethodTranslatingExpressionVisitorFactory">Indication whether to add a custom factory.</param>
 /// <returns>Provided <paramref name="builder"/>.</returns>
 public static SqliteDbContextOptionsBuilder AddCustomQueryableMethodTranslatingExpressionVisitorFactory(
     this SqliteDbContextOptionsBuilder builder,
     bool addCustomQueryableMethodTranslatingExpressionVisitorFactory = true)
 {
     builder.AddOrUpdateExtension(extension => extension.AddCustomQueryableMethodTranslatingExpressionVisitorFactory = addCustomQueryableMethodTranslatingExpressionVisitorFactory);
     return(builder);
 }
        public static SqliteDbContextOptionsBuilder AddCustomSchemaExtension(this SqliteDbContextOptionsBuilder sqliteDbContextOptionsBuilder, IServiceCollection services)
        {
            var infrastructure = sqliteDbContextOptionsBuilder as IRelationalDbContextOptionsBuilderInfrastructure;

            infrastructure.AddCustomSchemaExtension(services);
            return(sqliteDbContextOptionsBuilder);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Adds support for "RowNumber".
 /// </summary>
 /// <param name="builder">Options builder.</param>
 /// <param name="addRowNumberSupport">Indication whether to enable or disable the feature.</param>
 /// <returns>Provided <paramref name="builder"/>.</returns>
 public static SqliteDbContextOptionsBuilder AddRowNumberSupport(
     this SqliteDbContextOptionsBuilder builder,
     bool addRowNumberSupport = true)
 {
     builder.AddOrUpdateExtension(extension => extension.AddRowNumberSupport = addRowNumberSupport);
     return(builder);
 }
        public static SqliteDbContextOptionsBuilder AddCustomSchemaModelSupport(this SqliteDbContextOptionsBuilder sqliteDbContextOptionsBuilder, DbContextOptionsBuilder dbContextOptionsBuilder, IServiceCollection services)
        {
            services.AddTransient <CustomSchemaOptionsExtension>();
            dbContextOptionsBuilder.ReplaceService <IModelCacheKeyFactory, CustomSchemaModelCacheKeyFactory>();
            sqliteDbContextOptionsBuilder.AddCustomSchemaExtension(services);

            return(sqliteDbContextOptionsBuilder);
        }
        public static SqliteDbContextOptionsBuilder MigrationsHistoryTableWithSchema(this SqliteDbContextOptionsBuilder sqliteDbContextOptionsBuilder, DbContextOptionsBuilder optionsBuilder)
        {
            if (sqliteDbContextOptionsBuilder != null)
            {
                IDbContextCustomSchema dbContextCustomSchema = optionsBuilder.GetDbContextCustomSchema();

                if (dbContextCustomSchema != null && dbContextCustomSchema.UseCustomSchema)
                {
                    sqliteDbContextOptionsBuilder.MigrationsHistoryTable(dbContextCustomSchema.MigrationsHistoryTableName, dbContextCustomSchema.Schema);
                }
            }
            return(sqliteDbContextOptionsBuilder);
        }
Ejemplo n.º 6
0
        private static SqliteDbContextOptionsBuilder AddOrUpdateExtension(this SqliteDbContextOptionsBuilder sqliteOptionsBuilder,
                                                                          Action <SqliteDbContextOptionsExtension> callback)
        {
            if (sqliteOptionsBuilder == null)
            {
                throw new ArgumentNullException(nameof(sqliteOptionsBuilder));
            }

            var infrastructure    = (IRelationalDbContextOptionsBuilderInfrastructure)sqliteOptionsBuilder;
            var relationalOptions = infrastructure.OptionsBuilder.TryAddExtension <RelationalDbContextOptionsExtension>();

            infrastructure.OptionsBuilder.AddOrUpdateExtension(callback, () => new SqliteDbContextOptionsExtension(relationalOptions));

            return(sqliteOptionsBuilder);
        }
        public static SqliteDbContextOptionsBuilder UseNodaTime(this SqliteDbContextOptionsBuilder builder)
        {
            if (builder is null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            var coreBuilder = ((IRelationalDbContextOptionsBuilderInfrastructure)builder).OptionsBuilder;

            var extension = coreBuilder.Options.FindExtension <SqliteNodaTimeOptionsExtension>()
                            ?? new SqliteNodaTimeOptionsExtension();

            ((IDbContextOptionsBuilderInfrastructure)coreBuilder).AddOrUpdateExtension(extension);

            return(builder);
        }
        /// <summary>
        ///     Use NetTopologySuite to access SpatiaLite data.
        /// </summary>
        /// <param name="optionsBuilder"> The build being used to configure SQLite. </param>
        /// <returns> The options builder so that further configuration can be chained. </returns>
        public static SqliteDbContextOptionsBuilder UseNetTopologySuite(
            [NotNull] this SqliteDbContextOptionsBuilder optionsBuilder)
        {
            Check.NotNull(optionsBuilder, nameof(optionsBuilder));

            var coreOptionsBuilder = ((IRelationalDbContextOptionsBuilderInfrastructure)optionsBuilder).OptionsBuilder;
            var infrastructure     = (IDbContextOptionsBuilderInfrastructure)coreOptionsBuilder;
            var sqliteExtension    = coreOptionsBuilder.Options.FindExtension <SqliteOptionsExtension>()
                                     ?? new SqliteOptionsExtension();
            var ntsExtension = coreOptionsBuilder.Options.FindExtension <SqliteNetTopologySuiteOptionsExtension>()
                               ?? new SqliteNetTopologySuiteOptionsExtension();

            infrastructure.AddOrUpdateExtension(sqliteExtension.WithLoadSpatialite(true));
            infrastructure.AddOrUpdateExtension(ntsExtension);

            return(optionsBuilder);
        }
Ejemplo n.º 9
0
        /// <summary>
        ///     Use NetTopologySuite to access SpatiaLite data.
        /// </summary>
        /// <remarks>
        ///     See <see href="https://aka.ms/efcore-docs-spatial">Spatial data</see>, and
        ///     <see href="https://aka.ms/efcore-docs-sqlite">Accessing SQLite databases with EF Core</see> for more information.
        /// </remarks>
        /// <param name="optionsBuilder">The build being used to configure SQLite.</param>
        /// <returns>The options builder so that further configuration can be chained.</returns>
        public static SqliteDbContextOptionsBuilder UseNetTopologySuite(
            this SqliteDbContextOptionsBuilder optionsBuilder)
        {
            var coreOptionsBuilder = ((IRelationalDbContextOptionsBuilderInfrastructure)optionsBuilder).OptionsBuilder;
            var infrastructure     = (IDbContextOptionsBuilderInfrastructure)coreOptionsBuilder;

#pragma warning disable EF1001 // Internal EF Core API usage.
            // #20566
            var sqliteExtension = coreOptionsBuilder.Options.FindExtension <SqliteOptionsExtension>()
                                  ?? new SqliteOptionsExtension();
            var ntsExtension = coreOptionsBuilder.Options.FindExtension <SqliteNetTopologySuiteOptionsExtension>()
                               ?? new SqliteNetTopologySuiteOptionsExtension();

            infrastructure.AddOrUpdateExtension(sqliteExtension.WithLoadSpatialite(true));
#pragma warning restore EF1001 // Internal EF Core API usage.
            infrastructure.AddOrUpdateExtension(ntsExtension);

            return(optionsBuilder);
        }
Ejemplo n.º 10
0
 private void ContextBuilder(SqliteDbContextOptionsBuilder optionsBuilder)
 {
     optionsBuilder.MigrationsAssembly(System.Reflection.Assembly.GetExecutingAssembly().FullName);
 }
 protected override void ConfigureOptions(SqliteDbContextOptionsBuilder sqlServerDbContextOptionsBuilder)
 => sqlServerDbContextOptionsBuilder.QueryClientEvaluationBehavior(QueryClientEvaluationBehavior.Throw);
 protected override void ConfigureOptions(SqliteDbContextOptionsBuilder sqlServerDbContextOptionsBuilder)
     => sqlServerDbContextOptionsBuilder.DisableQueryClientEvaluation();
 protected virtual SqliteDbContextOptionsBuilder ConfigureOptions(SqliteDbContextOptionsBuilder sqliteDbContextOptionsBuilder)
     => sqliteDbContextOptionsBuilder;
Ejemplo n.º 14
0
 /// <summary>
 /// Adds support for bulk operations.
 /// </summary>
 /// <param name="sqliteOptionsBuilder">SQLite options builder.</param>
 /// <param name="addBulkOperationSupport">Indication whether to enable or disable the feature.</param>
 /// <returns>Provided <paramref name="sqliteOptionsBuilder"/>.</returns>
 public static SqliteDbContextOptionsBuilder AddBulkOperationSupport(this SqliteDbContextOptionsBuilder sqliteOptionsBuilder,
                                                                     bool addBulkOperationSupport = true)
 {
     return(AddOrUpdateExtension(sqliteOptionsBuilder, extension => extension.AddBulkOperationSupport = addBulkOperationSupport));
 }
 protected virtual void ConfigureOptions(SqliteDbContextOptionsBuilder sqliteDbContextOptionsBuilder)
 {
 }
 protected override SqliteDbContextOptionsBuilder ConfigureOptions(SqliteDbContextOptionsBuilder sqlServerDbContextOptionsBuilder)
     => sqlServerDbContextOptionsBuilder.QueryClientEvaluationBehavior(QueryClientEvaluationBehavior.Throw);
 /// <summary>
 /// 重写以实现<see cref="SqliteDbContextOptionsBuilder"/>的自定义行为
 /// </summary>
 protected virtual void SqliteDbContextOptionsBuilderAction(SqliteDbContextOptionsBuilder options)
 {
 }
 protected virtual void ConfigureOptions(SqliteDbContextOptionsBuilder sqliteDbContextOptionsBuilder)
 {
 }
Ejemplo n.º 19
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // set a default culture of en-US if none is specified
            string culture = _config[ConfigurationKey.Culture] ?? DefaultCulture;

            _logger.LogInformation("Configuring for culture: {0}", culture);
            services.Configure <RequestLocalizationOptions>(_ =>
            {
                _.DefaultRequestCulture = new RequestCulture(culture);
                _.SupportedCultures     = new List <CultureInfo> {
                    new CultureInfo(culture)
                };
                _.SupportedUICultures = new List <CultureInfo> {
                    new CultureInfo(culture)
                };
            });

            // Add framework services.
            services.AddSession(_ =>
            {
                _.IdleTimeout = TimeSpan.FromMinutes(30);
            });

            services.TryAddSingleton(_ => _config);
            services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>();

            services.AddResponseCompression(_ =>
            {
                _.Providers.Add <GzipCompressionProvider>();
                _.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] {
                    "application/vnd.ms-fontobject",
                    "application/x-font-opentype",
                    "application/x-font-truetype",
                    "application/x-font-ttf",
                    "application/x-javascript",
                    "font/eot",
                    "font/opentype",
                    "font/otf",
                    "image/svg+xml",
                    "image/vnd.microsoft.icon",
                    "text/javascript"
                });
            });

            // configure distributed cache
            string protectionPath =
                !string.IsNullOrEmpty(_config[ConfigurationKey.DataProtectionPath])
                ? _config[ConfigurationKey.DataProtectionPath]
                : Path.Combine(Directory.GetCurrentDirectory(), "shared", "dataprotection");
            string discriminator = _config[ConfigurationKey.ApplicationDiscriminator]
                                   ?? "gra";

            switch (_config[ConfigurationKey.DistributedCache]?.ToLower())
            {
            case "redis":
                string redisConfig = _config[ConfigurationKey.RedisConfiguration]
                                     ?? throw new Exception($"{ConfigurationKey.DistributedCache} has Redis selected but {ConfigurationKey.RedisConfiguration} is not set.");
                string redisInstance = "gra." + discriminator;
                if (!redisInstance.EndsWith("."))
                {
                    redisInstance += ".";
                }
                services.AddDistributedRedisCache(_ =>
                {
                    _.Configuration = redisConfig;
                    _.InstanceName  = redisInstance;
                });
                var redis = ConnectionMultiplexer.Connect(redisConfig);
                services.AddDataProtection(_ => _.ApplicationDiscriminator = discriminator)
                .PersistKeysToRedis(redis, $"grainternal.{discriminator}.dpk")
                .SetApplicationName(discriminator);
                _logger.LogInformation("Using Redis distributed cache {0} discriminator {1}",
                                       redisConfig,
                                       redisInstance);
                break;

            case "sqlserver":
                string sessionCs = _config.GetConnectionString("SqlServerSessions")
                                   ?? throw new Exception($"{ConfigurationKey.DistributedCache} has SQL Server selected but SqlServerSessions connection string is not set.");
                string sessionTable = _config[ConfigurationKey.SqlSessionTable] ?? "Sessions";
                _logger.LogInformation("Using SQL Server distributed cache in table {sessionTable}", sessionTable);
                services.AddDistributedSqlServerCache(_ =>
                {
                    _.ConnectionString = sessionCs;
                    _.SchemaName       = _config[ConfigurationKey.SqlSessionSchemaName] ?? "dbo";
                    _.TableName        = sessionTable;
                });
                services.AddDataProtection(_ => _.ApplicationDiscriminator = discriminator)
                .PersistKeysToFileSystem(new DirectoryInfo(Path.Combine(protectionPath, "keys")))
                .SetApplicationName(discriminator);
                break;

            default:
                _logger.LogInformation("Using memory-based distributed cache");
                services.AddDistributedMemoryCache();
                services.AddDataProtection(_ => _.ApplicationDiscriminator = discriminator)
                .PersistKeysToFileSystem(new DirectoryInfo(Path.Combine(protectionPath, "keys")))
                .SetApplicationName(discriminator);
                break;
            }

            // add MVC
            services.AddMvc()
            .SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_1);

            // Add custom view directory
            services.Configure <RazorViewEngineOptions>(options =>
                                                        options.ViewLocationFormats.Insert(0, "/shared/views/{1}/{0}.cshtml")
                                                        );

            // set cookie authentication options
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(_ => new CookieAuthenticationOptions
            {
                LoginPath        = new PathString("/SignIn/"),
                AccessDeniedPath = new PathString("/"),
            });

            services.AddAuthorization(options =>
            {
                foreach (object permisisonName in Enum.GetValues(typeof(Domain.Model.Permission)))
                {
                    options.AddPolicy(permisisonName.ToString(),
                                      _ => _.RequireClaim(ClaimType.Permission, permisisonName.ToString()));
                }

                options.AddPolicy(Domain.Model.Policy.ActivateChallenges,
                                  _ => _.RequireClaim(ClaimType.Permission,
                                                      Domain.Model.Permission.ActivateAllChallenges.ToString(),
                                                      Domain.Model.Permission.ActivateSystemChallenges.ToString()));
            });

            // path validator
            services.AddScoped <Controllers.Base.ISitePathValidator,
                                Controllers.Validator.SitePathValidator>();

            // service facades
            services.AddScoped <Controllers.ServiceFacade.Controller,
                                Controllers.ServiceFacade.Controller>();
            services.AddScoped <Data.ServiceFacade.Repository, Data.ServiceFacade.Repository>();

            // database
            if (string.IsNullOrEmpty(_config[ConfigurationKey.ConnectionStringName]))
            {
                throw new Exception("GraConnectionStringName is not configured in appsettings.json - cannot continue");
            }

            string csName = _config[ConfigurationKey.ConnectionStringName]
                            ?? throw new Exception($"{ConfigurationKey.ConnectionStringName} must be provided.");

            // mute ignored includes warnings
            // see https://docs.microsoft.com/en-us/ef/core/querying/related-data#ignored-includes
            var dbContextBuilder = new DbContextOptionsBuilder <Data.Context>();

            if (_logger.IsEnabled(LogLevel.Debug) || _logger.IsEnabled(LogLevel.Trace))
            {
                dbContextBuilder.ConfigureWarnings(w => w.Ignore());
            }

            string cs = _config.GetConnectionString(csName)
                        ?? throw new Exception($"A {csName} connection string must be provided.");

            switch (_config[ConfigurationKey.ConnectionStringName])
            {
            case ConnectionStringNameSqlServer:
                var sqlBuilder = new SqlServerDbContextOptionsBuilder(dbContextBuilder);
                if (!string.IsNullOrEmpty(_config[ConfigurationKey.SqlServer2008]))
                {
                    sqlBuilder.UseRowNumberForPaging();
                }
                services.AddDbContextPool <Data.Context,
                                           Data.SqlServer.SqlServerContext>(
                    _ => _.UseSqlServer(cs, b => b = sqlBuilder));
                break;

            case ConnectionStringNameSQLite:
                var sqliteBuilder = new SqliteDbContextOptionsBuilder(dbContextBuilder);

                services.AddDbContextPool <Data.Context, Data.SQLite.SQLiteContext>(
                    _ => _.UseSqlite(cs, b => b = sqliteBuilder));
                break;

            default:
                throw new Exception($"Unknown GraConnectionStringName: {csName}");
            }

            // utilities
            services.AddScoped <IDateTimeProvider, CurrentDateTimeProvider>();
            services.AddScoped <IUserContextProvider, Controllers.UserContextProvider>();
            services.AddScoped <Security.Abstract.IPasswordHasher, Security.PasswordHasher>();
            services.AddScoped <IPasswordValidator, PasswordValidator>();
            services.AddScoped <IPathResolver, PathResolver>();
            services.AddScoped <ITokenGenerator, TokenGenerator>();
            services.AddScoped <IEntitySerializer, EntitySerializer>();
            services.AddScoped <ICodeGenerator, CodeGenerator>();
            services.AddScoped <ICodeSanitizer, CodeSanitizer>();
            services.AddScoped <WebSocketHandler>();

            // filters
            services.AddScoped <Controllers.Filter.MissionControlFilter>();
            services.AddScoped <Controllers.Filter.NotificationFilter>();
            services.AddScoped <Controllers.Filter.SiteFilter>();
            services.AddScoped <Controllers.Filter.UserFilter>();

            // services
            services.AddScoped <ActivityService>();
            services.AddScoped <AuthenticationService>();
            services.AddScoped <AuthorizationCodeService>();
            services.AddScoped <AvatarService>();
            services.AddScoped <BadgeService>();
            services.AddScoped <CategoryService>();
            services.AddScoped <ChallengeService>();
            services.AddScoped <DailyLiteracyTipService>();
            services.AddScoped <DashboardContentService>();
            services.AddScoped <DrawingService>();
            services.AddScoped <EmailReminderService>();
            services.AddScoped <EmailService>();
            services.AddScoped <EventImportService>();
            services.AddScoped <EventService>();
            services.AddScoped <GroupTypeService>();
            services.AddScoped <MailService>();
            services.AddScoped <PageService>();
            services.AddScoped <PointTranslationService>();
            services.AddScoped <PrizeWinnerService>();
            services.AddScoped <QuestionnaireService>();
            services.AddScoped <ReportService>();
            services.AddScoped <RoleService>();
            services.AddScoped <SampleDataService>();
            services.AddScoped <SchoolImportService>();
            services.AddScoped <SchoolService>();
            services.AddScoped <SiteLookupService>();
            services.AddScoped <SiteService>();
            services.AddScoped <SystemInformationService>();
            services.AddScoped <TemplateService>();
            services.AddScoped <TriggerService>();
            services.AddScoped <UserService>();
            services.AddScoped <VendorCodeService>();

            services.AddScoped <Domain.Report.ServiceFacade.Report>();
            services.AddScoped <Domain.Report.ActivityByProgramReport>();
            services.AddScoped <Domain.Report.BadgeReport>();
            services.AddScoped <Domain.Report.BadgeTopScoresReport>();
            services.AddScoped <Domain.Report.CommunityExperiencesReport>();
            services.AddScoped <Domain.Report.CurrentStatusByProgramReport>();
            services.AddScoped <Domain.Report.CurrentStatusReport>();
            services.AddScoped <Domain.Report.GroupVendorCodeReport>();
            services.AddScoped <Domain.Report.RegistrationsAchieversBySchoolReport>();
            services.AddScoped <Domain.Report.RegistrationsAchieversReport>();
            services.AddScoped <Domain.Report.ParticipantPrizeReport>();
            services.AddScoped <Domain.Report.ParticipantProgressReport>();
            services.AddScoped <Domain.Report.ParticipantCountMinutesByProgram>();
            services.AddScoped <Domain.Report.PrizeRedemptionReport>();
            services.AddScoped <Domain.Report.TopScoresReport>();
            services.AddScoped <Domain.Report.VendorCodeDonationsReport>();
            services.AddScoped <Domain.Report.VendorCodeReport>();

            // service resolution
            string initialProgramSetup = DefaultInitialProgramSetup;

            if (!string.IsNullOrEmpty(_config[ConfigurationKey.InitialProgramSetup]))
            {
                initialProgramSetup = _config[ConfigurationKey.InitialProgramSetup];
            }

            switch (initialProgramSetup)
            {
            case ConfigurationMultipleProgramValue:
                services.AddScoped <IInitialSetupService, SetupMultipleProgramService>();
                break;

            case ConfigurationSingleProgramValue:
                services.AddScoped <IInitialSetupService, SetupSingleProgramService>();
                break;

            default:
                throw new Exception($"Unable to perform initial setup - unrecognized GraDefaultProgramSetup: {initialProgramSetup}");
            }

            // repositories
            services.AddScoped <Domain.Repository.IAnswerRepository, Data.Repository.AnswerRepository>();
            services.AddScoped <Domain.Repository.IAuthorizationCodeRepository, Data.Repository.AuthorizationCodeRepository>();
            services.AddScoped <Domain.Repository.IAvatarBundleRepository, Data.Repository.AvatarBundleRepository>();
            services.AddScoped <Domain.Repository.IAvatarColorRepository, Data.Repository.AvatarColorRepository>();
            services.AddScoped <Domain.Repository.IAvatarElementRepository, Data.Repository.AvatarElementRepository>();
            services.AddScoped <Domain.Repository.IAvatarItemRepository, Data.Repository.AvatarItemRepository>();
            services.AddScoped <Domain.Repository.IAvatarLayerRepository, Data.Repository.AvatarLayerRepository>();
            services.AddScoped <Domain.Repository.IBadgeRepository, Data.Repository.BadgeRepository>();
            services.AddScoped <Domain.Repository.IBookRepository, Data.Repository.BookRepository>();
            services.AddScoped <Domain.Repository.IBranchRepository, Data.Repository.BranchRepository>();
            services.AddScoped <Domain.Repository.IBroadcastRepository, Data.Repository.BroadcastRepository>();
            services.AddScoped <Domain.Repository.ICategoryRepository, Data.Repository.CategoryRepository>();
            services.AddScoped <Domain.Repository.IChallengeRepository, Data.Repository.ChallengeRepository>();
            services.AddScoped <Domain.Repository.IChallengeGroupRepository, Data.Repository.ChallengeGroupRepository>();
            services.AddScoped <Domain.Repository.IChallengeTaskRepository, Data.Repository.ChallengeTaskRepository>();
            services.AddScoped <Domain.Repository.IDailyLiteracyTipImageRepository, Data.Repository.DailyLiteracyTipImageRepository>();
            services.AddScoped <Domain.Repository.IDailyLiteracyTipRepository, Data.Repository.DailyLiteracyTipRepository>();
            services.AddScoped <Domain.Repository.IDashboardContentRepository, Data.Repository.DashboardContentRepository>();
            services.AddScoped <Domain.Repository.IDrawingCriterionRepository, Data.Repository.DrawingCriterionRepository>();
            services.AddScoped <Domain.Repository.IDrawingRepository, Data.Repository.DrawingRepository>();
            services.AddScoped <Domain.Repository.IEmailReminderRepository, Data.Repository.EmailReminderRepository>();
            services.AddScoped <Domain.Repository.IEventRepository, Data.Repository.EventRepository>();
            services.AddScoped <Domain.Repository.IGroupInfoRepository, Data.Repository.GroupInfoRepository>();
            services.AddScoped <Domain.Repository.IGroupTypeRepository, Data.Repository.GroupTypeRepository>();
            services.AddScoped <Domain.Repository.ILocationRepository, Data.Repository.LocationRepository>();
            services.AddScoped <Domain.Repository.IMailRepository, Data.Repository.MailRepository>();
            services.AddScoped <Domain.Repository.INotificationRepository, Data.Repository.NotificationRepository>();
            services.AddScoped <Domain.Repository.IPageRepository, Data.Repository.PageRepository>();
            services.AddScoped <Domain.Repository.IPointTranslationRepository, Data.Repository.PointTranslationRepository>();
            services.AddScoped <Domain.Repository.IPrizeWinnerRepository, Data.Repository.PrizeWinnerRepository>();
            services.AddScoped <Domain.Repository.IProgramRepository, Data.Repository.ProgramRepository>();
            services.AddScoped <Domain.Repository.IQuestionRepository, Data.Repository.QuestionRepository>();
            services.AddScoped <Domain.Repository.IQuestionnaireRepository, Data.Repository.QuestionnaireRepository>();
            services.AddScoped <Domain.Repository.IRecoveryTokenRepository, Data.Repository.RecoveryTokenRepository>();
            services.AddScoped <Domain.Repository.IRequiredQuestionnaireRepository, Data.Repository.RequiredQuestionnaireRepository>();
            services.AddScoped <Domain.Repository.IReportCriterionRepository, Data.Repository.ReportCriterionRepository>();
            services.AddScoped <Domain.Repository.IReportRequestRepository, Data.Repository.ReportRequestRepository>();
            services.AddScoped <Domain.Repository.IRoleRepository, Data.Repository.RoleRepository>();
            services.AddScoped <Domain.Repository.ISchoolDistrictRepository, Data.Repository.SchoolDistrictRepository>();
            services.AddScoped <Domain.Repository.ISchoolRepository, Data.Repository.SchoolRepository>();
            services.AddScoped <Domain.Repository.ISchoolTypeRepository, Data.Repository.SchoolTypeRepository>();
            services.AddScoped <Domain.Repository.ISiteRepository, Data.Repository.SiteRepository>();
            services.AddScoped <Domain.Repository.ISiteSettingRepository, Data.Repository.SiteSettingRepository>();
            services.AddScoped <Domain.Repository.ISystemInformationRepository, Data.Repository.SystemInformationRepository>();
            services.AddScoped <Domain.Repository.ISystemRepository, Data.Repository.SystemRepository>();
            services.AddScoped <Domain.Repository.ITriggerRepository, Data.Repository.TriggerRepository>();
            services.AddScoped <Domain.Repository.IUserLogRepository, Data.Repository.UserLogRepository>();
            services.AddScoped <Domain.Repository.IUserRepository, Data.Repository.UserRepository>();
            services.AddScoped <Domain.Repository.IVendorCodeRepository, Data.Repository.VendorCodeRepository>();
            services.AddScoped <Domain.Repository.IVendorCodeTypeRepository, Data.Repository.VendorCodeTypeRepository>();

            services.AddAutoMapper();
        }
 protected virtual SqliteDbContextOptionsBuilder ConfigureOptions(SqliteDbContextOptionsBuilder sqliteDbContextOptionsBuilder)
 => sqliteDbContextOptionsBuilder;
 protected override void ConfigureOptions(SqliteDbContextOptionsBuilder sqlServerDbContextOptionsBuilder)
 => sqlServerDbContextOptionsBuilder.DisableQueryClientEvaluation();