GridLab Connection String Modifier - Skills Guide¶
Skill Type: Database Configuration
Technology Stack: .NET, ABP Framework, Multi-Database Support
Complexity Level: Beginner
Last Updated: 2024
📋 Overview¶
The Connection String Modifier service enables dynamic modification of database connection strings based on tenant names, making it ideal for multi-tenant applications where each tenant requires isolated database instances.
Key Capabilities¶
- ✅ Multi-tenant database isolation
- ✅ Dynamic connection string modification
- ✅ Support for multiple database providers
- ✅ Automatic tenant-based database switching
- ✅ Seamless ABP Framework integration
Supported Database Providers¶
| Provider | Connection String Support | Status |
|---|---|---|
| MS SQL Server | ✅ Full Support | Stable |
| MySQL | ✅ Full Support | Stable |
| PostgreSQL | ✅ Full Support | Stable |
| Oracle | ✅ Full Support | Stable |
| Cosmos DB | ✅ Full Support | Stable |
| Firebird | ✅ Full Support | Stable |
| SQLite | ✅ Full Support | Stable |
Prerequisites¶
- .NET 9.0 or higher
- Multi-tenant application architecture
- NuGet package manager
🚀 Quick Start¶
Step 1: Install NuGet Package¶
Install the GridLab.Abp.ConnectionString package from NuGet:
Install-Package GridLab.Abp.ConnectionString
Package Information: - Package Name: GridLab.Abp.ConnectionString - Repository: GitLab - GridLab ABP Framework - NuGet: GridLab.Abp.ConnectionString
Step 2: Add Module Dependency¶
Add the AbpGridLabConnectionStringModule to your ABP module's dependency list:
[DependsOn(
//...other dependencies
typeof(AbpGridLabConnectionStringModule)
)]
public class YourModule : AbpModule
{
}
💡 Usage Examples¶
Basic Usage¶
The connection string modifier automatically generates tenant-specific connection strings:
using GridLab.Abp.ConnectionString;
public class TenantDataService : ITransientDependency
{
private readonly IDefaultConnectionStringModifier _connectionStringModifier;
private readonly ILogger<TenantDataService> _logger;
public TenantDataService(
IDefaultConnectionStringModifier connectionStringModifier,
ILogger<TenantDataService> logger)
{
_connectionStringModifier = connectionStringModifier;
_logger = logger;
}
public void ConnectToTenantDatabase()
{
// Original base connection string
string originalConnectionString = "Data Source=myServer;Initial Catalog=myDB;Integrated Security=true;";
// Tenant identifier
string tenantName = "customer";
// Modify connection string for specific tenant
string modifiedConnectionString = _connectionStringModifier.Modify(
originalConnectionString,
tenantName
);
_logger.LogInformation("Modified connection string for tenant: {TenantName}", tenantName);
// Use the modified connection string with your DbContext or data access layer
// Result: "Data Source=myServer;Initial Catalog=myDB_customer;Integrated Security=true;"
}
}
Multi-Tenant Database Service¶
public class MultiTenantDatabaseService : ITransientDependency
{
private readonly IDefaultConnectionStringModifier _connectionStringModifier;
private readonly IConfiguration _configuration;
public MultiTenantDatabaseService(
IDefaultConnectionStringModifier connectionStringModifier,
IConfiguration configuration)
{
_connectionStringModifier = connectionStringModifier;
_configuration = configuration;
}
public string GetTenantConnectionString(string tenantName)
{
// Get base connection string from configuration
var baseConnectionString = _configuration.GetConnectionString("Default");
// Modify for specific tenant
return _connectionStringModifier.Modify(baseConnectionString, tenantName);
}
}
Different Database Providers¶
public class DatabaseProviderExamples
{
private readonly IDefaultConnectionStringModifier _modifier;
public DatabaseProviderExamples(IDefaultConnectionStringModifier modifier)
{
_modifier = modifier;
}
public void SqlServerExample()
{
var original = "Server=localhost;Database=MainDB;Integrated Security=true;";
var modified = _modifier.Modify(original, "tenant1");
// Result: "Server=localhost;Database=MainDB_tenant1;Integrated Security=true;"
}
public void PostgreSqlExample()
{
var original = "Host=localhost;Database=maindb;Username=user;Password=pass";
var modified = _modifier.Modify(original, "tenant1");
// Result: "Host=localhost;Database=maindb_tenant1;Username=user;Password=pass"
}
public void MySqlExample()
{
var original = "Server=localhost;Database=maindb;Uid=root;Pwd=password;";
var modified = _modifier.Modify(original, "tenant1");
// Result: "Server=localhost;Database=maindb_tenant1;Uid=root;Pwd=password;"
}
}
🔧 Advanced Scenarios¶
Integration with DbContext¶
public class TenantDbContextFactory : IDesignTimeDbContextFactory<YourDbContext>
{
public YourDbContext CreateDbContext(string[] args)
{
var configuration = BuildConfiguration();
var modifier = new DefaultConnectionStringModifier();
var tenantName = "your-tenant";
var baseConnectionString = configuration.GetConnectionString("Default");
var tenantConnectionString = modifier.Modify(baseConnectionString, tenantName);
var builder = new DbContextOptionsBuilder<YourDbContext>()
.UseSqlServer(tenantConnectionString);
return new YourDbContext(builder.Options);
}
}
📚 Best Practices¶
✅ Do's¶
- Use meaningful tenant names (e.g., company names, unique identifiers)
- Store base connection strings in secure configuration
- Validate tenant names before modification
- Log connection string modifications for audit purposes
- Test with all supported database providers
❌ Don'ts¶
- Don't hardcode connection strings in code
- Don't use special characters in tenant names that could break connection strings
- Don't expose modified connection strings in logs (security)
- Don't modify connection strings manually when this service is available
🔍 Troubleshooting¶
Common Issues¶
Issue: Modified connection string doesn't work - Solution: Verify the tenant name doesn't contain invalid characters - Solution: Ensure the base database exists before appending tenant suffix
Issue: Connection string format not recognized - Solution: Verify your database provider is in the supported list - Solution: Check the connection string format matches provider standards