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