Я пишу библиотеку, которая будет предоставлять коллекцию открытых типов для своих потребителей.
Я хочу сделать типы из этой библиотеки дружественными для внедрения зависимостей.Это означает, что каждый класс должен иметь конструктор, с помощью которого можно указывать каждую отдельную зависимость инициализируемого объекта.Я также хочу, чтобы библиотека придерживалась соглашения по принципу конфигурации.Это означает, что если потребитель хочет поведение по умолчанию, он может использовать конструктор без параметров, и объект каким-то образом создаст зависимости для себя.
В примере (C #):
public class Samurai {
private readonly IWeapon _weapon;
// consumers will use this constructor most of the time
public Samurai() {
_weapon = ??? // get an instance of the default weapon somehow
}
// consumers will use this constructor if they want to explicitly
// configure dependencies for this instance
public Samurai(IWeapon weapon) {
_weapon = weapon;
}
}
MyПервое решение было бы использовать шаблон локатора службы.
Код будет выглядеть так:
...
public Samurai() {
_weapon = ServiceLocator.Instance.Get<IWeapon>();
}
...
У меня есть проблема с этим, хотя.Сервисный локатор был помечен как анти-шаблон ( ссылка ), и я полностью согласен с этими аргументами.С другой стороны, Мартин Фаулер выступает за использование шаблона поиска служб именно в этой ситуации (библиотечные проекты) ( ссылка ).Я хочу быть осторожным и исключить возможную необходимость переписать библиотеку после того, как обнаружится, что локатор службы действительно был плохой идеей.
Итак, в заключение - считаете ли вы, что локатор службы в этом сценарии подходит?Должен ли я решить мою проблему совершенно по-другому?Любая мысль приветствуется ...