Ao longo dos anos usando o C # / .NET para vários projetos internos, tivemos uma biblioteca crescer organicamente em uma enorme quantidade de coisas. Chama-se "Util", e tenho certeza que muitos de vocês já viram uma dessas bestas em suas carreiras.
Muitas partes desta biblioteca são muito independentes e podem ser divididas em projetos separados (que gostaríamos de código aberto). Mas há um grande problema que precisa ser resolvido antes que eles possam ser lançados como bibliotecas separadas. Basicamente, existem muitos casos do que eu poderia chamar de "dependências opcionais" entre essas bibliotecas.
Para explicar melhor, considere alguns dos módulos que são bons candidatos para se tornarem bibliotecas independentes. CommandLineParser
é para analisar linhas de comando. XmlClassify
é para serializar classes para XML. PostBuildCheck
executa verificações no assembly compilado e relata um erro de compilação se elas falharem. ConsoleColoredString
é uma biblioteca para literais de strings coloridos. Lingo
é para traduzir interfaces de usuário.
Cada uma dessas bibliotecas pode ser usada completamente independente, mas se forem usadas juntas, haverá recursos extras úteis. Por exemplo, ambos CommandLineParser
e XmlClassify
expõem a funcionalidade de verificação pós-compilação, o que requer PostBuildCheck
. Da mesma forma, CommandLineParser
permite que a documentação da opção seja fornecida usando os literais de strings coloridos, exigindo ConsoleColoredString
, e suporta a documentação traduzível via Lingo
.
Portanto, a principal distinção é que esses são recursos opcionais . Pode-se usar um analisador de linha de comando com strings simples e sem cores, sem traduzir a documentação ou executar verificações pós-compilação. Ou pode-se tornar a documentação traduzível, mas ainda sem cor. Ou colorido e traduzível. Etc.
Examinando esta biblioteca "Util", vejo que quase todas as bibliotecas potencialmente separáveis possuem recursos opcionais que as vinculam a outras bibliotecas. Se eu realmente exigisse essas bibliotecas como dependências, esse monte de coisas não é realmente desordenado: você ainda precisaria basicamente de todas as bibliotecas se quiser usar apenas uma.
Existem abordagens estabelecidas para gerenciar essas dependências opcionais no .NET?