using System; using System.Data; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using ServiceStack.Data; using ServiceStack.OrmLite; using zero.Configuration; using zero.Models; using zero.Modules; namespace zero.Sqlite; public static class ZeroBuilderExtensions { public static ZeroBuilder AddSqlite(this ZeroBuilder builder) { builder.AddModule(); return builder; } } internal class ZeroSqliteModule : ZeroModule { 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("Zero:Sqlite")); services.ConfigureOptions(); } protected IDbConnectionFactory CreateDbConnectionFactory(IServiceProvider services) { IZeroOptions options = services.GetService(); SqliteOptions sqliteOptions = options.For(); return new OrmLiteConnectionFactory(sqliteOptions.ConnectionString, SqliteDialect.Provider); } protected IDbConnection CreateDbConnection(IServiceProvider services) { IDbConnectionFactory factory = services.GetService(); IZeroOptions options = services.GetService(); SqliteOptions sqliteOptions = options.For(); IDbConnection db = factory.CreateDbConnection(); db.Open(); sqliteOptions.OnConnectionCreate?.Invoke(db); return db; } }