Представьте набор библиотек, представляющих некоторые API. Используя инверсию механизмов управления, конкретные реализации будут внедрены в проект потребления.Подходы к развязке библиотеки API?
В этом случае ситуация. У меня есть некоторые библиотеки API в зависимости от других библиотек API для определенных функций, поэтому сами библиотеки API связаны в какой-то момент. Эта связь может стать проблемой позже, поскольку изменение одного API приведет к изменениям зависимых API-интерфейсов, и соответствующие реализации также необходимо будет изменить, поэтому в худшем случае мы получаем довольно много проектов, которые должны быть измененный, чтобы отражать изменение, только один из них.
Теперь я имею в виду два возможных решения для этого:
Создать API проект монолит, который объединяет соответствующие библиотеки API.
Дальнейшие развязки API, создавая каждую библиотеку, предоставляют интерфейсы для всех функций, которые зависят от другого API, поэтому прямая зависимость удаляется. Это может привести к аналогичному коду в обеих библиотеках, но дает свободу реализации, выбранным с помощью механизмов IoC, а также позволяет API-интерфейсам улучшаться независимо друг от друга (при изменении API изменения будут влиять только на его библиотеки реализации, а не другие API или их реализации).
Проблема со вторым подходом является тиражированием кода, и результат может быть иметь слишком много библиотек API, которые должны быть ссылками (например, в приложении .NET каждый API будет отдельная DLL В некоторых сценариях, таких как приложения Silverlight, это может быть проблемой с размером приложения - временем загрузки и производительностью клиента).
Есть ли лучшее решение для этой ситуации. Когда лучше объединить некоторые библиотеки API в одну большую, а когда нет? Я знаю, что это очень общий вопрос, который я задаю, но на какое-то время позволяет игнорировать соответствующие сроки, оценки, требования клиентов и технологии. Я хочу, чтобы можно было определить правильный подход, основанный на достижении максимальной масштабируемости и минимальном времени обслуживания. Итак, что может быть хорошей причиной для выбора любого подхода или другого, который вы могли бы мне предложить?
Edit:
Я чувствую, что я должен пояснить кое-что о вопросе. Я имею в виду развязывание API друг от друга, а не API от его реализации. Так, например, если у меня есть API безопасности для проверки разрешений доступа и API учетных записей пользователей, который использует (ссылки) API безопасности, изменение API безопасности приведет к необходимости изменения API учетных записей пользователей и реализации обоих из них. Чем больше API-интерфейсов, которые будут соединены таким образом, тем больше изменений придется применять. Этого я хочу избежать.
Это правда, что вы говорите.Все еще находясь на месте владельца библиотеки и стремясь использовать их в более чем одном проекте, это может привести к очень сложным вещам при применении изменений. Слишком много кода для изменения - проблема, которую я бы хотел избежать. Кроме того, управление версиями библиотек подразумевает их разветвление. Поиск проблемы, допустимой для нескольких ветвей, вызывает модификации всех из них, не говоря уже о зависимых проектах и реализациях. Я был бы рад узнать или посоветоваться о способах минимизации этих усилий. –
Если вы взглянете на мой второй подход, вы, вероятно, увидите, что он пытается свести к минимуму цели изменения, рефакторинга или обновления за счет дополнительных осложнений и, возможно, дублирования кода. Тем не менее, улучшения во всех связанных библиотеках будут доступны, не изменяя их всех. Моя цель - как минимизировать зависимости, которые потребуют модификации и обновления, и в то же время позволяют преимуществам изменений влиять как можно больше на приложение-потребитель. –
Я не согласен, ваше «решение» без проблем может усложнить ситуацию, потому что нечего решать. Зависимости должны быть разрешены инструментом или чем-то «внешним», а не кодом! Это не развязка, это похоже на антипаттерн для меня. Мое мнение, конечно. – vulkanino