using System; using System.Data; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using ServiceStack.Data; using ServiceStack.OrmLite; using Mixtape.Configuration; using Mixtape.Models; using Mixtape.Modules; namespace Mixtape.Sqlite; public static class MixtapeBuilderExtensions { public static MixtapeBuilder AddSqlite(this MixtapeBuilder builder) { builder.AddModule(); return builder; } } internal class MixtapeSqliteModule : MixtapeModule { public override void ConfigureServices(IServiceCollection services, IConfiguration configuration) { services.AddSingleton(CreateDbConnectionFactory); services.AddScoped(CreateDbConnection); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddOptions(); services.AddOptions().Bind(configuration.GetSection("Mixtape:Sqlite")); services.ConfigureOptions(); } protected IDbConnectionFactory CreateDbConnectionFactory(IServiceProvider services) { IMixtapeOptions options = services.GetService(); SqliteOptions sqliteOptions = options.For(); return new OrmLiteConnectionFactory(sqliteOptions.ConnectionString, SqliteDialect.Provider); } protected IDbConnection CreateDbConnection(IServiceProvider services) { IDbConnectionFactory factory = services.GetService(); IMixtapeOptions options = services.GetService(); SqliteOptions sqliteOptions = options.For(); IDbConnection db = factory.CreateDbConnection(); db.Open(); sqliteOptions.OnConnectionCreate?.Invoke(db); return db; } }