2011-06-21 18 views
9

Budujemy platformę oprogramowania .NET do automatyzacji testów do użytku domowego w naszej firmie.Zarządzanie i struktura rosnącego projektu .NET

Aplikacja składa się z komponentu GUI (WinForms) i różnych "akcji", które są dynamicznie ładowane do niego w celu wykonania.

Jest już około 100 projektów akcji, a ich liczba rośnie. Niektóre z tych projektów są współzależne od innych projektów i tak dalej.

Wszystkie załadowane akcje muszą odnosić się do naszej biblioteki SDK "SDK" dla różnych działań (wyniki do głównej aplikacji, rejestrowanie itp.).

Z tej stosunkowo prostej konstrukcji, mamy do czynienia niektóre decyzje dotyczące zarządzania, które chcielibyśmy zainteresować rozwiązać w jak najlepszy sposób:

  1. powinny czynności („wtyczek”) Odniesienie naszą produkcję projektu SDK, lub jakiś znany stabilna wersja tego? Na przykład przy opracowywaniu dużej aplikacji (np. MS Office), nie wszystkie zespoły pracują w naturalny sposób z kodem źródłowym dla wszystkich komponentów.

Jakie jest najlepsze rozwiązanie dla czegoś takiego? i dlaczego?

  1. Jak prawidłowo zweryfikować, czy wszystkie potrzebne zależności (na przykład biblioteki innych firm) są rzeczywiście pobierane z właściwej lokalizacji?

Jakie są typowe praktyki w scenariuszach, w których zarządzanie wieloma projektami, które są ze sobą powiązane? Czy są jakieś wskazówki, aby to zrobić?

+0

Posiadam interfejsy stabilne dla zestawu SDK. Jeśli potrzebujesz zmienić interfejs, opracuj nowy i wycofaj stary, ale wdrażaj go przez pewien czas. Chciałbym, aby każdy projekt wtyczki był zbudowany na najnowszym SDK. Zajrzałbym do MEF lub lepszego dla mnie narzędzia DI, takiego jak Autofac. – kenny

+1

Prawdopodobnie wolałbym podejście "praca z daną, stabilną wersją" - a dzięki NuGet można łatwo spakować swoje SDK i inne pliki wsparcia do pakietów NuGet, które można łatwo zainstalować w Visual Studio, a także starannie zaktualizować! –

+0

Czy mogę wdrażać pakiety NuGet wewnątrz naszej firmy? co oznacza, że ​​inni użytkownicy mogą pobierać najnowsze aktualizacje bez publicznego ujawniania naszego kodu? –

Odpowiedz

2

To jest problem, że nie ma jednoznacznej odpowiedzi, ale ...

Istnieją dwie drogi, które można podjąć. Silnie sprzężony system lub luźno sprzężony system.

Dla systemu silnie sprzężonego mogę zaproponować dwa katalogi dla plików binarnych: katalog stron trzecich oraz katalog zawierający pliki DLL, które kompiluje firma, do których inni deweloperzy mogą się odwoływać. Zewnętrzne biblioteki DLL (spoza firmy) powinny znajdować się w źródłowej kontroli, aby wszyscy programiści odnosili się do tych samych wersji bibliotek DLL innych firm z tej samej lokalizacji, co pozwala uniknąć niespójności między programistami a problemami związanymi z instalowaniem oprogramowania stron trzecich na każdym komputerze. Domowe biblioteki DLL nie powinny być przywoływane w źródłowej kontroli i powinny być budowane na każdej maszynie programistycznej za pośrednictwem zautomatyzowanego pliku wsadowego budowania lub podobnego. W kroku budowania postu możesz skopiować je wszystkie do tego samego katalogu i dopóki programiści otrzymają najnowszą kontrolę i kompilację kodu źródłowego, każdy ma te same pliki DLL z twojej firmy.

Na przykład, pobierz najnowsze, skompiluj (używając pliku wsadowego, aby zbudować wszystkie potrzebne projekty), a następnie jako krok budowania postu skopiuj dane wyjściowe do wspólnego. Teraz wszystkie inne projekty mogą odwoływać się do wspólnych bibliotek DLL oraz bibliotek DLL innych firm z tej samej lokalizacji i wszyscy są konsekwentni.

Problem polega na tym, że odniesienia są silnie sprzężone, więc zmiany mogą czasami być problematyczne, jeśli nie zostaną poprawnie przekazane.

Luźno powiązany system korzysta z frameworka, takiego jak MEF (Managed Extensibility Framework), a odniesienia do komponentów "Contract DLL" definiują interfejsy dla komponentów.Projekt odwołuje się do interfejsu lub kontraktowych bibliotek DLL i nie obchodzi go implementacja, a MEF zarządza wtyczką.

W tym przypadku użytkownik odwołuje się do interfejsu DLL, ale nie do rzeczywistej biblioteki DLL, która implementuje.

Załóżmy na przykład, że mam interfejs o nazwie ILog z metodą o nazwie LogMessage.

private ILog _logger; 
_logger.LogMessage(); 

Tak więc, w przypadku silnie powiązanego: Action.DLL bezpośrednio odwołuje się do Logger.DLL.

W luźno powiązanym przypadku Action.DLL odwołuje się do ILog.DLL (tylko interfejs). Logger.DLL implementuje ILog.DLL. Ale Action.DLL nie ma bezpośredniego odniesienia do Logger.DLL.

Teraz mogę mieć dowolną liczbę bibliotek DLL, które implikują interfejs ILog, ale Action.DLL nie odwołuje się do nich bezpośrednio. To całkiem fajna i jedna z bardziej ekscytujących cech MEF i luźnego sprzężenia w ogóle, możliwość nie posiadania zależności.

W jaki sposób zdecydujesz się iść, tak czy owak jest do zaakceptowania, myślę, że luźno powiązany pomysł pasuje do Twojego scenariusza najlepiej, ponieważ zespoły musiałyby znać tylko kontrakty w porównaniu do rzeczywistych wdrożeń.

Nie miałbym jednej potężnej biblioteki DLL, spróbowałbym rozbić interfejsy na logiczne grupy. Na przykład rejestrowanie wydaje się interakcją typu Utility, więc utworzę DLL kontraktu Utility z interfejsem ILog. Sposób podziału jest zależny od tego, co próbujesz zrobić. Lub każdy interfejs może być DLL umowy, ale może to trochę ekstremalne.

+0

Czy MEF działa z .NET 3.5? –

1

Jest to nieco skomplikowany temat, szczególnie w .NET land. Nie wiem o "najlepszym" rozwiązaniu, ale wyjaśnię, jak sobie z tym radzimy; być może przyda ci się to dla ciebie.

Umożliwia to tworzenie dużych systemów z wieloma połączonymi projektami, ale powoduje wiele problemów związanych ze złożonością. Jak sądzę, każde tego rodzaju rozwiązanie byłoby możliwe.

Po pierwsze: struktura fizyczna (używamy SVN).

  • Jest pierwiastkiem kontroli źródła dla każdego projektu
  • Każdy projekt ma własne pień, gałęzie i tagi
  • Folder bagażnik ma folder build wersjami \ src i \, a niewersjonowany folderze \ lib Folder \ lib zawiera pliki binarne do odniesienia. Te pliki binarne mogą być bibliotekami innych firm lub innymi projektami, do których należy utworzyć łącze (np. Pakiet SDK). Wszystkie pliki binarne w katalogu \ lib pochodzą z repozytorium bluszczu korporacyjnego (patrz http://ant.apache.org/ivy/). Obecnie w kraju .NET występuje wiele ruchów związanych z NuGet, więc możesz to sprawdzić.

Twój versioned \ build folder zawiera skrypty budujące, na przykład, aby pobrać binaria z bluszczu, opublikować swój projekt na bluszczu lub skompilować każdy projekt. Przydadzą się także, gdy chcesz wskazać serwer Continuous Integration na każdym z twoich projektów.

drugie: Aby określić, gdzie Zależności pochodzą z

Odpowiedź: Pochodzą one z repozytorium bluszczu (może to być tak proste, jak system plików sieci dzielone). Utworzono repozytorium, więc masz kontrolę nad jego zawartością. Należy bardzo uważać na pliki binarne innych firm, które zostaną zainstalowane w GAC. Visual Studio to ból w^^, aby sobie z tym poradzić.

Konkretnie:

Jak prawidłowo sprawdzić, czy wszystkie potrzebne Zależności (biblioteki 3rd party dla przykład) są rzeczywiście pochodzi z odpowiednim miejscu?

Ivy zapewnia dużą elastyczność przy zależnościach, a także rozwiązuje przechodnie zależności; np. możesz polegać na SDK rev = "1. +" status = "latest.release" co oznaczałoby "najnowszą stabilną wersję 1.x pakietu SDK lub na SDK rev =" 2. + "status =" najnowszy. integracja ", która oznaczałaby najnowszą dostępną wersję binarną pakietu 2.x SDK (prawdopodobnie wyprodukowanego z ciągłej kompilacji integracyjnej)

Zawsze będziesz polegać na kompilowanych plikach binarnych, nigdy na danych wyjściowych projektu i możesz kontrolować, która wersja pliki binarne, które zostaną pobrane.) Zależności od innych firm zostaną prawdopodobnie przeniesione jako przechodnie na zestaw SDK

Oznacza to również, że ilość kodu w projektach pozostanie tak mała, jak potrzebujesz odpowiednich rozwiązań Visual Studio. oznacza, że ​​narzędzia do refaktoryzacji, takie jak ReSharper, będą o wiele mniej użyteczne, a także będą miały pewną złożoność o twoich skryptach budujących i twojej strategii rozgałęziania. To zależy w dużej mierze od logiki twoich komponentów.

To jest krótki przegląd, jeśli uważasz, że jest to coś, co chcesz, mogę rozszerzyć odpowiedź. Powodzenia; ekosystem .NET, a szczególnie Visual Studio, tak naprawdę nie działa tak.

Powiązane problemy