using System.Diagnostics; using LinqToDB; namespace Azaion.Common.Database; public interface IDbFactory { Task Run(Func> func); Task Run(Func func); T Run(Func func); } public class DbFactory : IDbFactory { private readonly DataOptions _dataOptions; public DbFactory(string connectionString, bool useTracing = true, bool msSql = false) { if (string.IsNullOrEmpty(connectionString)) throw new ArgumentException("Empty connectionString", nameof(connectionString)); _dataOptions = new DataOptions() .UsePostgreSQL(connectionString) .UseMappingSchema(AzaionDbSchemaHolder.MappingSchema); if (useTracing) _ = _dataOptions.UseTracing(TraceLevel.Info, t => Console.WriteLine(t.SqlText)); } public async Task Run(Func> func) { await using var db = new AzaionDb(_dataOptions); return await func(db); } public async Task Run(Func func) { await using var db = new AzaionDb(_dataOptions); await func(db); } public T Run(Func func) { using var db = new AzaionDb(_dataOptions); return func(db); } }