2016-03-14 6 views
2

Почему UseNinjectMiddleware берут лямбда вместо экземпляра контейнера?Можно ли пропускать Ninject Web.Common UseNinjectMiddleware lambda, который возвращает экземпляр ядра?

Вы согласны?

var container = CreateKernel(); 
app.UseNinjectMiddleware(() => container); 

вместо этого:

app.UseNinjectMiddleware(() => CreateKernel); 

Мой контейнер, например, в первом фрагменте используется для разрешения зависимостей в другой части моего приложения. Нужно ли Ninject Middleware создавать собственные экземпляры, которые он может модифицировать, настраивать и воссоздавать по желанию? Если нет, я бы хотел избежать создания дерева зависимостей более одного раза, поэтому я задаюсь вопросом, нормально ли для лямбда просто вернуть экземпляр.

+0

, когда я это делаю, ninject не влезает, может быть, он выходит из сферы действия? – tofutim

ответ

2

Есть несколько вещей, чтобы отметить:

OwinBootstrapper компонент будет загружать любые определенные NinjectModule «S после вызова переданных в Func<IKernel>, так что вы должны заботиться, что вы ничего не загружать в два раза. see here

Bootstrapper компонент вызывает Dispose на IKernel, так что вы должны быть уверены, что вы не пытаетесь получить доступ к экземпляру после завершения работы было начато. see here


Вы можете получить почти до базового ядра сразу после того, он был создан, может быть, вы предпочли бы, чтобы поднять PR, чтобы сделать его доступным?

В настоящее время OwinAppBuilderExtensions определяет

public const string NinjectOwinBootstrapperKey = "NinjectOwinBootstrapper"; 

, который он использует для хранения во время выполнения экземпляра OwinBootstrapper

app.Properties.Add(NinjectOwinBootstrapperKey, bootstrapper); 

OwinBootstrapper имеет частную ссылку на время выполнения экземпляра Bootstrapper компонента и Bootstrapper экземпляр, в свою очередь, предоставляет ссылку на экземпляр времени выполнения IKernel

public IKernel Kernel 
{ 
    get { return kernelInstance; } 
} 

Так немного PR добавление

public IKernel Kernel 
{ 
    get 
    { 
     this.bootstrapper.Kernel; 
    } 
} 

к OwinBootstrapper может сделать основной IKernel доступными для кода через app.Properties после вызова app.UseNinjectMiddleware(() => container);.