Skip to content

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


📖 Additional Resources