2013-06-04 2 views
39

Может ли кто-нибудь сказать мне, могу ли я зарегистрировать уже созданный экземпляр класса с Ninject, чтобы он использовал этот экземпляр каждый раз, когда ему нужно впрыскивать?Ninject: Регистрация уже созданного экземпляра с помощью Ninject?

Я предполагаю, что вы можете назвать его одиночным, но у меня есть экземпляр, который уже создан. Вся документация указывает на создание новых экземпляров класса.

+0

.InSingletonScope() является то, что вы после. Он создает единый экземпляр и ударяет его по всему, что ему нужно, потому что он катится. –

+3

Спасибо, но InSingleScope создает экземпляр, у меня уже есть экземпляр, он был инициализирован множеством свойств .... поэтому мне нужно зарегистрировать этот конкретный экземпляр ... У вас есть пример.? – Martin

+0

Помните, что вы должны строить граф зависимости, вы не должны создавать новые объекты, контейнер должен знать о них все до запуска вашего приложения, поэтому, если вы создаете новые объекты, а затем хотите каким-то образом ссылаться на них другая область вашего приложения, которая звучит как какой-то анти-шаблон, такой как Service Locator, в котором вы будете захватывать экземпляры из ядра во всем мире. Если я не понимаю что-то, извините, если я есть :) –

ответ

57

Вы можете использовать метод ToConstant, который принимает уже существующий экземпляр и регистрирует его как singleton.

var kernel = new StandardKernel(); 
kernel.Bind<MyClass>().ToConstant(myClassInstance); 

Если вы хотите что-то более сложным, вы можете использовать ToMethod (где вы можете использовать Func, чтобы получить экземпляр) в сочетании с InSingletonScope

var kernel = new StandardKernel(); 
kernel.Bind<MyClass>().ToMethod(context => myClassInstance).InSingletonScope(); 
+1

Ницца, в каких ситуациях кто-то будет привязывать экземпляр, который еще не был создан в каком-то NinjectModule? Кажется немного странным для меня, если привязки не могут быть сделаны по какой-то причине в начале приложения и могут потребовать некоторого обмана, сделанного другим. Никогда не использовался .ToConstant, кажется полезным для сложных ситуаций :) –

+0

Привет, patrick, у меня есть экземпляр объекта, предоставленного мне началом приложения сторонним компонентом, этот экземпляр заполнен свойствами, если я просто обновился этот объект или у него был новый модуль, хотя он был бы одиночным, у меня не было бы всех правильных свойств. Но я готов советовать. Я в настоящее время передаю свой объект конструктору модуля ninject, который я создал и использую ninject для регистрации, чем экземпляр в соответствии с nemesv. – Martin

+2

Это должно решить вашу проблему, так как Мартин дал вам хороший пример того, как уже пройти через ваш экземпляр объекта :) –

Смежные вопросы