Co gdy każdy programista ma inne lokalne ustawienia aplikacji?

Całkiem normalną sytuacją jest, gdy każdy sam sobie instaluje server bazy danych (powiedzmy SQL Server). Wtedy u każdego ta nazwa może być różna. Ktoś zainstalował wersję SQL Express, ktoś inny ma już kilka wersji SQL (2008, 2012, 2014, 2016, …) różnie nazwanych, u kogoś innego w poprzednim projekcie instancja musiała się konkretnie nazywać.

Podmiana w configu i ignorowanie

Prędzej czy później dochodzimy więc do sytuacji, że aby odpalić taką aplikację lokalnie każdy sobie podmienia connection string i robi tak, żeby System Kontroli Wersji nie widział tego jako zmiany, czyli żeby nie poszło z następnym commitem.

Wspólny Setup

Inne rozwiązanie to jakiś wspólny setup stawiania całego środowiska. Kiedyś było to klonowanie maszyny wirtualnej, teraz będą to kontenery lub skrypty, które to lokalnie ustawią. Jeśli jedynym problem, który próbujemy rozwiącać jest ta nazwa instancji servera, to takie podejście to duuuże przekombinowanie.

Proste rozwiązanie w kodzie

To wersja najprostsza, ale widać całą ideę. Dodajemy nazwę maszyny do nazwy connection stringa:

using System;
using System.Configuration;
static class ConnectionStringsProvider
{
static ConnectionStringSettings _connectionString;
public static ConnectionStringSettings Get()
{
if (_connectionString == null)
{
string connectionStringName = "YourDbName";
string localConnectionStringName = connectionStringName + "@" + Environment.MachineName;
ConnectionStringSettings connectionString = GetConnectionString(localConnectionStringName);
_connectionString = connectionString ?? GetConnectionString(connectionStringName);
}
return _connectionString;
}
static ConnectionStringSettings GetConnectionString(string name)
{
return ConfigurationManager.ConnectionStrings[name];
}
}

<connectionStrings>
<add name="YourDbName" connectionString="Data Source=.;Initial Catalog=YourDbName;" />
<add name="YourDbName@czarek" connectionString="Data Source=.;Initial Catalog=YourDbName;" />
<add name="YourDbName@jarek" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=YourDbName;" />
<add name="YourDbName@arek" connectionString="Data Source=(local)\SqlServer;Initial Catalog=YourDbName;" />
</connectionStrings>

view raw
web.config
hosted with ❤ by GitHub

Niezmienne rzeczy jak providerName zostały usunięte.

W ostatnim projekcie na 4 developerów były 3 różne nazwy.

3 Comments on “Co gdy każdy programista ma inne lokalne ustawienia aplikacji?

  1. Pingback: dotnetomaniak.pl

  2. Alternatywą jest zdefiniowanie aliasu w ustawieniach serwera sql i posługiwanie się nim w connection string. Tak mam w kilku swoich projektach, w plikach .reg mam zdefiniowany alias do serwera sql. Pliki są ignorowane w repo. Łatwo mogę przełączyć się z instancji developer na test lub na serwer produkcyjny.