Передайте свойство в конструктор для простых сценариев.
В более сложных случаях используйте интерфейс контейнера Ioc, предоставьте реализацию по умолчанию, но сделайте ее достаточно простой, чтобы ее можно было реализовать с любым константом.
CommonServiceLocator - это такой интерфейс.
Редактировать:
Я бы предложил другой дизайн, который бы сделал CommonServiceLocator бесполезным и улучшил бы общее восприятие пользователей вашей библиотеки:
Вы выбираете контейнер Ioc, который имеет все необходимые функции для ваших внутренних библиотечных требований, и вы ILMerge его как внутренний, чтобы пользователи вашей библиотеки не видели его.
Пользователи не должны знать, что библиотека использует контейнер.
Затем необходимо указать две основные точки расширения:
Конфигурация - способ обеспечить пользовательскую реализацию зависимостей (например, Logger ...)
Фабрики - если вашей библиотеке требуется создать экземпляр объекта пользователя, предоставьте способ указать фабрику, чтобы ваши пользователи могли его подключить. Таким образом, они могут использовать свой собственный контейнер для создания и внедрения своих объектов.
Я сделал два полных поста в блоге об этом дизайне:
Контейнер IOC, Go Hide
Контейнер МОК, Go Hider (часть 2)