Ninject: Регистрация уже созданного экземпляра в Ninject?

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

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


person Martin    schedule 04.06.2013    source источник
comment
.InSingletonScope () - это то, что вам нужно. Он создает один экземпляр и вставляет его во все, что в нем нуждается, потому что именно так он катится.   -  person Patrick Magee    schedule 04.06.2013
comment
Спасибо, но InSingleScope создает экземпляр, у меня уже есть экземпляр, он был инициализирован несколькими свойствами .... так что мне нужно зарегистрировать этот конкретный экземпляр ... У вас есть пример?   -  person Martin    schedule 04.06.2013
comment
Помните, что вы должны строить граф зависимостей, вы не должны создавать новые объекты, контейнер должен знать обо всех них до запуска вашего приложения, поэтому, если вы создаете новые объекты, а затем хотите каким-то образом ссылаться на них в каком-то другом область вашего приложения, это звучит как своего рода антишаблон, такой как Service Locator, в котором вы будете везде захватывать экземпляры из ядра. Если я что-то не понимаю, извините, если я :)   -  person Patrick Magee    schedule 04.06.2013
comment
Если что-то «уже создано», это означает, что что-то было создано НЕ Ninject или в ядре, поэтому это трудно понять.   -  person Patrick Magee    schedule 04.06.2013
comment
В настоящее время мне также не нужен доступ к IKernel из любого места, поскольку каждый объект вводится с его необходимыми зависимостями. Единственное, что мне нужно сделать в Main (это консольное приложение) ... do var process = kernel.Get ‹ProccessApp› (); и вызвать .Perform ... это запускает мой первый экземпляр объекта из ядра, а затем каждый другой экземпляр вводится через граф объектов ... через конструкторы.   -  person Martin    schedule 05.06.2013
comment
Я понимаю. Итак, в чем проблема, я не понимаю. Я думал, что @nemesv решает вашу проблему.   -  person Patrick Magee    schedule 05.06.2013
comment
Да, спасибо.   -  person Martin    schedule 05.06.2013
comment
Это серьезная проблема, потому что иногда вы не можете гибко создать объект самостоятельно (или позволить Ninject создать его), но какой-то сумасшедший API дает вам объект, и если вы (или Ninject) создали новый , это будет сломанный / нефункциональный объект. - Кроме того, иногда среда выполнения создает определенные объекты и управляет ими, и вы не можете позволить Ninject просто создавать новый каждый раз, когда вам нужен доступ к нему.   -  person BrainSlugs83    schedule 07.12.2016


Ответы (1)


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

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

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

var kernel = new StandardKernel();
kernel.Bind<MyClass>().ToMethod(context => myClassInstance).InSingletonScope();
person nemesv    schedule 04.06.2013
comment
Хорошо, в каких ситуациях кто-то будет связывать экземпляр, который еще не был создан в каком-то NinjectModule? Мне это кажется немного странным, если только привязки не могут быть выполнены по какой-либо причине в начале приложения и могут потребовать некоторых уловок, сделанных в другом месте. Никогда не использовал .ToConstant, кажется полезным в сложных ситуациях :) - person Patrick Magee; 04.06.2013
comment
Привет, Патрик, у меня есть экземпляр объекта, данный мне при запуске приложения сторонним компонентом, этот экземпляр заполняется свойствами, если я просто обновил этот объект или создал новый модуль ninject, даже если это был бы синглтон, у меня не было бы всех правильных свойств. Но я готов дать совет. В настоящее время я передаю свой объект конструктору модуля ninject, который я создал, и использую ninject для регистрации, чем instance согласно nemesv. - person Martin; 05.06.2013
comment
Это должно решить вашу проблему, поскольку Мартин дал вам хороший пример того, как уже пройти через ваш экземпляр объекта :) - person Patrick Magee; 05.06.2013