DbDapperFactory 0.1.3
dotnet add package DbDapperFactory --version 0.1.3
NuGet\Install-Package DbDapperFactory -Version 0.1.3
<PackageReference Include="DbDapperFactory" Version="0.1.3" />
<PackageVersion Include="DbDapperFactory" Version="0.1.3" />
<PackageReference Include="DbDapperFactory" />
paket add DbDapperFactory --version 0.1.3
#r "nuget: DbDapperFactory, 0.1.3"
#:package DbDapperFactory@0.1.3
#addin nuget:?package=DbDapperFactory&version=0.1.3
#tool nuget:?package=DbDapperFactory&version=0.1.3
DbDapperFactory
Factory y extensiones de DI para crear DbConnection nombradas y usarlas con Dapper.
Qué es este paquete
DbDapperFactory es un paquete para aplicaciones .NET que simplifica el registro y la creación de conexiones a múltiples bases de datos cuando trabajas con Dapper.
Sirve para:
- registrar varias conexiones por nombre
- asociar cada conexión a un provider específico
- resolver conexiones desde inyección de dependencias
- mantener un punto único para crear
DbConnection
Actualmente el paquete incluye soporte para:
- SQL Server
- PostgreSQL
- MySQL
- SQLite
- Oracle
Paquete único
Los paquetes anteriores por provider fueron consolidados en un único paquete:
DbDapperFactory.CoreDbDapperFactory.SqlServerDbDapperFactory.PostgresDbDapperFactory.MySqlDbDapperFactory.SqliteDbDapperFactory.Oracle
Ahora todo se instala desde:
dotnet add package DbDapperFactory
Cuándo usarlo
Este paquete es útil cuando tu aplicación:
- consume una o varias bases de datos
- necesita separar conexiones por nombre, por ejemplo
Main,Reporting,Legacy - usa Dapper y quieres centralizar la creación de conexiones
- necesita cambiar entre providers sin reescribir toda la infraestructura de acceso a datos
API principal
IDapperConnectionFactory
La interfaz principal expone un único método:
public interface IDapperConnectionFactory
{
DbConnection CreateConnection(string name);
}
Puntos importantes:
CreateConnection(name)devuelve una conexión nueva cada vez- la factory no abre la conexión automáticamente
- tú controlas cuándo llamar a
Open()oOpenAsync() - la conexión debe cerrarse y disponerse con
using
Providers soportados
El enum actual es:
public enum DatabaseProvider
{
SqlServer,
Postgres,
MySql,
Sqlite,
Oracle
}
Formas de registro disponibles
La librería soporta tres formas principales de registrar conexiones.
Opción 1: registro fluido por provider
Usa esta opción cuando quieres definir cada conexión explícitamente en código.
Importante: los métodos
AddSqlServer,AddPostgres,AddMySql,AddSqliteyAddOracleviven en el namespaceDbDapperFactory.Providers.
using DbDapperFactory;
using DbDapperFactory.Providers;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddDapperConnectionFactory()
.AddSqlServer("Main", builder.Configuration.GetConnectionString("Main")!)
.AddPostgres("Reporting", builder.Configuration.GetConnectionString("Reporting")!)
.AddMySql("Legacy", builder.Configuration.GetConnectionString("Legacy")!);
También puedes usar los demás providers:
builder.Services
.AddDapperConnectionFactory()
.AddSqlite("Cache", "Data Source=cache.db;")
.AddOracle("ERP", "User Id=user;Password=pass;Data Source=MyOracleDb");
Opción 2: registro por nombre + DatabaseProvider
Usa esta opción cuando quieres leer las cadenas desde ConnectionStrings y solo indicar en código qué provider corresponde a cada nombre.
appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=localhost;Database=Documents;User Id=sa;Password=YourPassword;TrustServerCertificate=True",
"PostgresConnection": "Host=localhost;Port=5432;Database=documents;Username=postgres;Password=secret;Search Path=public"
}
}
Registro:
using DbDapperFactory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
services.AddProviderDapperConnectionFactory(
configuration,
("DefaultConnection", DatabaseProvider.SqlServer),
("PostgresConnection", DatabaseProvider.Postgres));
La librería buscará cada cadena en ConnectionStrings:{Name} y creará la conexión adecuada según el DatabaseProvider indicado.
AddMultiDbConnectionFactorysigue existiendo como alias obsoleto, pero la API recomendada esAddProviderDapperConnectionFactory.
Opción 3: registro por sección de configuración
Usa esta opción cuando quieres declarar también el provider dentro de la configuración.
appsettings.json:
{
"ConnectionStrings": {
"MainDb": "Server=localhost;Database=AppDb;User Id=sa;Password=YourPassword;TrustServerCertificate=True",
"ReportingDb": "Host=localhost;Port=5432;Database=reporting;Username=postgres;Password=secret"
},
"DbDapperFactory": {
"Connections": [
{
"Name": "Main",
"Provider": "SqlServer",
"ConnectionStringName": "MainDb"
},
{
"Name": "Reporting",
"Provider": "Postgres",
"ConnectionStringName": "ReportingDb"
},
{
"Name": "Cache",
"Provider": "Sqlite",
"ConnectionString": "Data Source=cache.db;"
}
]
}
}
Registro:
using DbDapperFactory;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDapperConnectionFactory(builder.Configuration);
La sección usada por defecto es DbDapperFactory.
Cada conexión puede resolver su cadena de estas formas:
ConnectionString: cadena directaConnectionStringName: nombre dentro deConnectionStrings- si omites ambas, intenta usar
Namecomo clave dentro deConnectionStrings
Ejemplo de uso con Dapper
using DbDapperFactory;
using Dapper;
public sealed class UsersRepository
{
private readonly IDapperConnectionFactory _connections;
public UsersRepository(IDapperConnectionFactory connections)
=> _connections = connections;
public async Task<User?> GetByIdAsync(Guid id)
{
using var conn = _connections.CreateConnection("Main");
await conn.OpenAsync();
return await conn.QuerySingleOrDefaultAsync<User>(
"select * from users where id = @id",
new { id });
}
public async Task<List<User>> GetAllAsync()
{
using var conn = _connections.CreateConnection("Main");
await conn.OpenAsync();
var users = await conn.QueryAsync<User>("select * from users");
return users.ToList();
}
public async Task<int> CreateAsync(User user)
{
using var conn = _connections.CreateConnection("Main");
await conn.OpenAsync();
return await conn.ExecuteAsync(
"insert into users (id, name, email) values (@id, @name, @email)",
user);
}
}
public sealed class User
{
public Guid Id { get; set; }
public string Name { get; set; } = string.Empty;
public string Email { get; set; } = string.Empty;
}
Ejemplo con múltiples bases de datos
using DbDapperFactory;
using DbDapperFactory.Providers;
using Dapper;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddDapperConnectionFactory()
.AddSqlServer("Operational", builder.Configuration.GetConnectionString("Operational")!)
.AddPostgres("Analytics", builder.Configuration.GetConnectionString("Analytics")!);
public sealed class ReportingService
{
private readonly IDapperConnectionFactory _connections;
public ReportingService(IDapperConnectionFactory connections)
=> _connections = connections;
public async Task<IReadOnlyList<OrderSummary>> GetOperationalOrdersAsync()
{
using var conn = _connections.CreateConnection("Operational");
await conn.OpenAsync();
var rows = await conn.QueryAsync<OrderSummary>(
"select top 10 Id, CustomerName, Total from dbo.Orders order by CreatedAt desc");
return rows.AsList();
}
public async Task<IReadOnlyList<DailySales>> GetAnalyticsAsync()
{
using var conn = _connections.CreateConnection("Analytics");
await conn.OpenAsync();
var rows = await conn.QueryAsync<DailySales>(
"select day, total from public.daily_sales order by day desc limit 10");
return rows.AsList();
}
}
Ejemplo rápido del paquete
Si quieres una referencia corta de para qué sirve el paquete, este es un caso típico:
using DbDapperFactory;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var services = new ServiceCollection();
services.AddProviderDapperConnectionFactory(
configuration,
("SqlDb", DatabaseProvider.SqlServer),
("PgDb", DatabaseProvider.Postgres));
var provider = services.BuildServiceProvider();
var factory = provider.GetRequiredService<IDapperConnectionFactory>();
using var sqlConnection = factory.CreateConnection("SqlDb");
using var pgConnection = factory.CreateConnection("PgDb");
Ese ejemplo muestra el objetivo del paquete: crear conexiones correctas por nombre y provider sin que tu código consumidor tenga que instanciar manualmente SqlConnection, NpgsqlConnection, MySqlConnection, SQLiteConnection u OracleConnection en distintos lugares.
Notas importantes
CreateConnection(name)crea una instancia nueva cada vez.- La factory no abre conexiones automáticamente.
- La librería funciona bien con Dapper, pero también puede usarse con ADO.NET puro.
- Si registras conexiones duplicadas por nombre en el builder fluido, la factory lanzará una excepción al resolverlas.
- Si usas
AddProviderDapperConnectionFactory, cada nombre debe existir enConnectionStrings.
Migración desde versiones anteriores
Si todavía estabas usando paquetes separados por provider, migra así:
1. Remueve los paquetes antiguos
dotnet remove package DbDapperFactory.Core
dotnet remove package DbDapperFactory.SqlServer
dotnet remove package DbDapperFactory.Postgres
dotnet remove package DbDapperFactory.MySql
dotnet remove package DbDapperFactory.Sqlite
dotnet remove package DbDapperFactory.Oracle
2. Instala el paquete único
dotnet add package DbDapperFactory
3. Ajusta los using si usas métodos por provider
using DbDapperFactory;
using DbDapperFactory.Providers;
👤 Autor
guevararogeljj
Licencia
Este proyecto está bajo licencia MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Dapper (>= 2.1.66)
- Microsoft.Data.SqlClient (>= 6.1.4)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.0)
- Microsoft.Extensions.Configuration.Binder (>= 10.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.3)
- Microsoft.Extensions.Options (>= 10.0.3)
- MySqlConnector (>= 2.3.7)
- Npgsql (>= 8.0.6)
- Oracle.ManagedDataAccess.Core (>= 23.4.0)
- System.Data.SQLite (>= 1.0.118)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.