2012-10-16 10 views
5

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.

+1

To brzmi jak szansa na wzór Service Locator: http://en.wikipedia.org/wiki/Service_locator_pattern –

+0

@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

+0

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) –

Odpowiedz

1

Ostatecznie zdecydowaliśmy się wprowadzić minimalną zmianę w masowej klasie, czyniąc ją częściową. Następnie w osobnym pliku dodaliśmy dodatkowy konstruktor, który akceptował różne parametry. W ten sposób, jeśli zaktualizujemy bibliotekę, jedyną zmianą, którą musimy wprowadzić, jest ponowne dodanie numeru partial.

1

Można wyeliminować zależność źródła konfiguracji obiektu, przekazując wszystkie wymagane pola przez konstruktor.

Zobacz Martin Fowler's article na iniekcji zależności. Ta sama koncepcja ma zastosowanie tutaj.

Powiązane problemy