Przez lata używania C # / .NET do wielu wewnętrznych projektów, jedna biblioteka rozwinęła się organicznie w jeden wielki zbiór rzeczy. Nazywa się to „Util” i jestem pewien, że wielu z was widziało jedną z tych bestii w swojej karierze.
Wiele części tej biblioteki jest bardzo samodzielnych i można je podzielić na osobne projekty (które chcielibyśmy otworzyć). Jest jednak jeden poważny problem, który należy rozwiązać, zanim zostaną one wydane jako osobne biblioteki. Zasadniczo istnieje wiele przypadków tego, co mogę nazwać „opcjonalnymi zależnościami” między tymi bibliotekami.
Aby to lepiej wyjaśnić, rozważ niektóre moduły, które są dobrymi kandydatami do zostania samodzielnymi bibliotekami. CommandLineParser
służy do analizowania wierszy poleceń. XmlClassify
służy do szeregowania klas do formatu XML. PostBuildCheck
wykonuje sprawdzanie skompilowanego zestawu i zgłasza błąd kompilacji, jeśli się nie powiedzie. ConsoleColoredString
to biblioteka kolorowych literałów łańcuchowych. Lingo
służy do tłumaczenia interfejsów użytkownika.
Każda z tych bibliotek może być używana całkowicie autonomicznie, ale jeśli są one używane razem, istnieją przydatne dodatkowe funkcje. Na przykład, zarówno CommandLineParser
i XmlClassify
narazić funkcjonalność sprawdzania post-build, który wymaga PostBuildCheck
. Podobnie, CommandLineParser
pozwala na dostarczenie dokumentacji opcji przy użyciu kolorowych literałów łańcuchowych, co jest wymagane ConsoleColoredString
, i obsługuje dokumentację do przetłumaczenia przez Lingo
.
Dlatego kluczowym rozróżnieniem jest to, że są to funkcje opcjonalne . Można użyć parsera wiersza poleceń z prostymi, bezbarwnymi łańcuchami, bez tłumaczenia dokumentacji lub wykonywania jakichkolwiek kontroli po kompilacji. Lub można sprawić, by dokument był przetłumaczalny, ale nadal bezbarwny. Lub zarówno kolorowe, jak i do przetłumaczenia. Itp.
Przeglądając tę bibliotekę „Util”, widzę, że prawie wszystkie potencjalnie rozdzielne biblioteki mają takie opcjonalne funkcje, które wiążą je z innymi bibliotekami. Gdybym naprawdę potrzebował tych bibliotek jako zależności, to ten plik rzeczy nie jest wcale nieplątany: nadal potrzebujesz wszystkich bibliotek, jeśli chcesz użyć tylko jednej.
Czy istnieją ustalone podejścia do zarządzania takimi opcjonalnymi zależnościami w .NET?