2010-02-19 4 views
5

Mam klasę statyczną, która zawiera logikę bazy danych.Jak sprawić, by moja klasa statyczna nie była tak statyczna?

Ta klasa jest używana w witrynie internetowej, usługach sieci Web i jako część komponentu oprogramowania pośredniego.

Dla każdej metody w tej klasie potrzebuję fragmentu informacji kontekstowej od osoby dzwoniącej. W przypadku strony internetowej byłyby to informacje o użytkowniku, w przypadku usługi sieciowej i komponentu oprogramowania pośredniego identyfikowałoby to usługę wywołującą.

Nie mogę zapisać tej wartości w konfiguracji, ponieważ może się to różnić w zależności od użytkownika, a ja nie zawsze mam taki tekst.

Mogłabym łatwo dodać nowy parametr do każdej metody w tej klasie lub mógłbym zmienić ją z klasy statycznej, tak aby miała pojedynczą właściwość niestatyczną, ale żadne z tych rozwiązań nie wydaje się bardzo eleganckie.

Czy są jakieś inne opcje, których nie rozważałem?

+3

świetny tytuł ^^ "jak sprawić, by mój singleton nie był tak pojedynczy" – tanascius

+0

@tanascius - bezcenny +1 powoduje, że wszystko, co mogę dać. @chris, możesz przemyśleć swoją strategię. W ogólnym raporcie zbiorczym powiem: "Statyczny DAL prosi o kłopot". .2 pesos. –

+0

@Sky Sanders - dzielenie włosów tutaj, ale DAL jest klasą linq do sql, jest to moja logika baz danych, która jest na wierzchu. Ignorując fakt, że już zaakceptowałem odpowiedź i przeszedłem drogą nie statyczną, czy mógłbyś zakwalifikować swoje oświadczenie "prosić o kłopot"? Dlaczego klasa statyczna to zły pomysł? –

Odpowiedz

6

Jeśli wszystkie metody wymagają jakiegoś stanu, brzmi to tak, jakbyś powinien utworzyć instancję i przekazać ten stan za pośrednictwem konstruktora.

Zmiana projektu z zestawu metod statycznych na instancję również ułatwi testowanie klasy.

+0

Im więcej o tym myślę, tym bardziej zbliżam się do tego pomysłu. Jedynym minusem jest dodatkowy wiersz kodu wymagany za każdym razem, gdy wymagane jest wywołanie metody. –

+0

+1 - jest to klasyczny przypadek wtrysku zależności/IoC (ręczny lub za pośrednictwem szkieletu kontenera). Zobacz także http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052 – TrueWill

+0

Czy tworzysz instancję dla każdego połączenia? W przeciwnym razie nie widzę potrzeby użycia dodatkowego kodu przy użyciu instancji. –

1

Chciałbym dodać parametry. Nie wydaje mi się to mało ważne - potrzebujesz informacji kontekstowych, a jedynym sposobem na uzyskanie go w klasie statycznej jest przekazanie go.

+1

Problem z tym jest taki, że nie wydaje mi się bardzo SUCHY. –

+0

Nie uważam tego za naruszenie DRY, koniecznie. Niezależnie od tego, czy zachowasz klasę statyczną, czy przełączysz się na tworzenie instancji, te metody będą wymagały informacji kontekstowych. Otrzymają go z parametru lub od członka instancji - żaden nie wydaje mi się problemem. W przypadku klasy, która jest częścią oprogramowania pośredniego db, a nie częścią twojego kontekstu, myślę, że klasa statyczna jest bardziej odpowiednia. Ponadto, jeśli twoja klasa statyczna jest bardzo duża, a twoje dane kontekstowe są bardzo małe, zachowałbym klasę statyczną. – Ray

+0

każda metoda korzysta z prywatnej metody konfiguracji połączenia. Właśnie tutaj używam informacji o kontekście, więc każda metoda nie "bezpośrednio" używa kontekstu, jeśli cenisz subtelną różnicę? Posiadanie tego parametru dla każdej metody, a następnie przekazanie jej do prywatnej metody brzmi jak powtórzenie. –