Свойство ядра Ninject.MVC3 Bootstrapper помечается как устаревшее.Как я могу получить доступ к ядру? - PullRequest
9 голосов
/ 18 мая 2011

Я обновил пакет Ninject.MVC3 с 2.2.1.0 до 2.2.2.0.Раньше у меня был доступ к объекту Kernel через свойство BootStrapper.Kernel, но в новой версии свойство Kernel помечено как устаревшее.Я получаю предупреждение о том, что

«Публичное свойство общего доступа ReadOnly как Ninject.IKernel» устарело: «Не используйте Ninject в качестве локатора служб».

Есть ли другой способ доступа к ядру в новой версии?

Ответы [ 4 ]

6 голосов
/ 18 мая 2011

Если у вас есть класс, который (по какой-то причине) должен извлекать объекты из ядра Ninject, вы можете включить ядро ​​в качестве одного из введенных свойств / параметров конструктора в классе. Этот шаблон лучше в том смысле, что вы явно заявляете, что конкретный класс использует ядро, а не всегда делает его доступным, как делает шаблон локатора службы.

Предполагается, что Ninject автоматически добавляет привязку экземпляра ядра к себе. Я знаю, что раньше это делалось, но если нет, вы можете добавить привязку вручную.

5 голосов
/ 19 мая 2011

Причина, по которой это было помечено как устаревшее и будет заменено на внутреннее в будущем, заключается в том, что люди склонны использовать Ninject в качестве указателя службы, если это возможно. Но Service Locator - это антипаттерн , который не должен использоваться. И поскольку мы не хотим предоставлять функциональность, которая помогает создавать плохо спроектированное программное обеспечение, оно будет удалено в будущем.

Если это требует много изменений в вашем коде, это признак того, что ваш код страдает от этого недомогания, и вам действительно следует изменить его на лучший дизайн.

  1. Ограничьте ваш доступ к ядру до минимума. В MVC практически нет ситуации, когда вам нужно что-то кроме простого конструктора. Поэтому мой первый совет - это рефакторинг в инжектор конструктора, где это возможно.
  2. В этих очень редких случаях, когда вам нужен доступ к ядру для создания других объектов, вы должны внедрить фабрику в класс, которому нужен новый экземпляр, и внедрить ядро ​​в эту фабрику (если конструктор имеет параметр Kernel, он получит экземпляр, делающий инъекцию).

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

2 голосов
/ 07 июля 2011

В ASP.NET MVC 3, я думаю, DepedencyResolver - это чистый способ получить указатель службы.

0 голосов
/ 18 мая 2011

Вы можете использовать Common Service Locator в качестве точки подключения службы в Ninject. Common Locator Locator позволяет вам только получать объекты, но не вводить объекты, которые у вас уже есть. Конечно, вы могли бы обойти это ограничение, но вы могли бы так же легко создать статический класс, который предоставляет ядро ​​Ninject и ссылается на него, а не на BootStrapper.

...