Czuję, że utknąłem między kilkoma złymi rozwiązaniami i potrzebuję porady, jak zminimalizować przyszłe cierpienie. Używamy Masywny ORM, które w jego konstruktora ma te linie:Najmniejszy sposób na zmianę zachowania konstruktora
var _providerName = "System.Data.SqlClient";
if (ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName != null)
_providerName = ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName;
_factory = DbProviderFactories.GetFactory(_providerName);
ConnectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
Ważną częścią dla mnie jest to, że ona czyta ciągów połączenia z ConfigurationManager
. Staramy się scentralizować konfigurację, a przy tym chcemy zachować ciągi połączeń poza naszym web/app.configs (mamy około 150 wdrożonych hostów, więc narzut staje się znaczący). Jednak to się psuje, ponieważ odczyt pliku konfiguracyjnego jest tutaj zakodowany na stałe, a kolekcja ConnectionStrings
jest tylko do odczytu (istnieją obejścia, ale wszystkie są dość brudne).
Jednym z możliwych sposobów jest wyodrębnienie tych linii do metody wirtualnej, a następnie zmiana z dziedziczeniem. Nie jest to takie przyjemne, gdy chcemy aktualizować Massive, a także wywoływanie wirtualnych metod z konstruktora jest potencjalnie złe.
Jakie mam inne alternatywy? Głównym priorytetem jest minimalizacja wpływu podczas aktualizacji.
To brzmi jak szansa na wzór Service Locator: http://en.wikipedia.org/wiki/Service_locator_pattern –
@JoshC .: Tak, jedną z możliwości jest przekształcenie go w jakiś interfejs 'IConfigurationManager', który ma domyślny implementacja po prostu używa ConfigurationManager. Nie jestem jednak pewien, jakie są plusy i minusy w porównaniu do dziedziczenia? – carlpett
co z przechowywaniem ciągów połączeń w osobnym pliku? Czy to pomogłoby? (patrz "Korzystanie z zewnętrznych plików konfiguracyjnych" msdn.microsoft.com/en-us/library/ms254494(v=vs.80).aspx) –