Метод RegisterSingle<T>
- это просто причудливый вспомогательный метод, облегчающий жизнь. То, что вы можете сделать с RegisterSingle<T>
, также можно сделать с помощью метода Register<T>
. На сайте приведены примеры этого . Вы можете зарегистрировать один экземпляр, используя метод Register<T>
следующим образом (он использует замыкание):
var weapon = new Katana();
container.Register<IWeapon>(() => weapon);
Если вы посмотрите примеры управления образом жизни на веб-сайте, вы увидите следующий пример создания статического экземпляра потока:
[ThreadStatic]
private static IWeapon weapon;
container.Register<IWeapon>(
() => return weapon ?? (weapon = new Katana()));
Я думаю, что это сила упрощения, потому что вы почти ничего не можете сделать с этим шаблоном. То, чего вы пытаетесь достичь, немного сложнее, я должен признать это, но в действительности ничего не продвинуло ИМО. Вот код, необходимый для решения вашей проблемы:
private static IWeapon weapon;
container.Register<IWeapon>(
() => weapon ?? (weapon = container.GetInstance<Katana>()));
Хитрость здесь в том, чтобы сохранить экземпляр в статической переменной (так же, как со статическим потоком), но теперь вам не следует создавать экземпляр самостоятельно, new
его задействовав, но вы делегируете создание в Simple Service Локатор. Это работает, потому что, как вы знаете, SimpleServiceLocator будет выполнять автоматическое внедрение конструктора при запросе конкретного типа.
Я должен признать, что это позор, что нам нужно сделать этот обман. Было бы хорошо, если бы библиотека могла сделать это за нас. Например, я могу представить добавляемую перегрузку RegisterSingle<T>
, которая позволяет нам делать следующее:
container.RegisterSingle<IWeapon>(
() => container.GetInstance<Katana>());
Пожалуйста, дайте мне знать, что вы думаете о такой перегрузке. Я всегда заинтересован в обратной связи, чтобы сделать библиотеку лучше. Это, безусловно, будет хорошей функцией для следующего релиза.
Обновление:
С версии 0.14 мы можем сделать следующее:
container.RegisterSingle<IWeapon, Katana>();
Это не станет легче, чем это.
Приветствия