За годы использования C # / .NET для множества собственных проектов у нас была одна библиотека, органически растущая в одну огромную пачку вещей. Он называется «Утил», и я уверен, что многие из вас видели одного из этих зверей в своей карьере.
Многие части этой библиотеки очень автономны и могут быть разделены на отдельные проекты (которые мы хотели бы с открытым исходным кодом). Но есть одна важная проблема, которую необходимо решить, прежде чем их можно будет выпускать в виде отдельных библиотек. По сути, существует множество случаев, которые я мог бы назвать «необязательными зависимостями» между этими библиотеками.
Чтобы лучше это объяснить, рассмотрим некоторые из модулей, которые являются хорошими кандидатами на то, чтобы стать автономными библиотеками. CommandLineParser
для анализа командных строк. XmlClassify
для сериализации классов в XML. PostBuildCheck
выполняет проверку скомпилированной сборки и сообщает об ошибке компиляции, если она не удалась. ConsoleColoredString
библиотека для цветных строковых литералов Lingo
для перевода пользовательских интерфейсов.
Каждая из этих библиотек может использоваться полностью автономно, но если они используются вместе, то есть полезные дополнительные функции, которые необходимо иметь. Например, оба CommandLineParser
и XmlClassify
выставляют функциональность проверки после сборки, которая требует PostBuildCheck
. Точно так же, CommandLineParser
опция позволяет предоставлять документацию опций с использованием цветных строковых литералов, требующих ConsoleColoredString
, и поддерживает переводимую документацию через Lingo
.
Таким образом, ключевое отличие заключается в том, что это дополнительные функции . Можно использовать синтаксический анализатор командной строки с простыми неокрашенными строками, не переводя документацию и не выполняя никаких проверок после сборки. Или можно сделать документацию переводимой, но все же неокрашенной. Или как цветной, так и переводимый. И т.п.
Просматривая эту библиотеку «Util», я вижу, что почти все потенциально разделяемые библиотеки имеют такие дополнительные функции, которые связывают их с другими библиотеками. Если бы я на самом деле требовал, чтобы эти библиотеки были зависимостями, тогда эта пачка вещей на самом деле совсем не распутана: вам все равно потребуются все библиотеки, если вы хотите использовать только одну.
Существуют ли установленные подходы к управлению такими необязательными зависимостями в .NET?