Ответ 1
Вы можете использовать расширения NamedScope, чтобы определить, что контроллер определяет область действия и использует эту область для всего, что находится в области запроса. Лучше всего использовать соглашения для этого определения:
const string ControllerScope = "ControllerScope";
kernel.Bind(x => x.FromThisAssembly()
.SelectAllClasses().InheritedFrom<ApiController>()
.BindToSelf()
.Configure(b => b.DefinesNamedScope(ControllerScope)));
kernel.Bind<IMyComponent>().To<MyComponent>().InNamedScope(ControllerScope);
Я рекомендую реализовать INotifyWhenDisposed
для контроллеров, чтобы объекты в области запроса были немедленно освобождены после запроса. Например. используя следующий класс вместо ApiController
public abstract class NinjectApiController : ApiController, INotifyWhenDisposed
{
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
this.IsDisposed = true;
this.Disposed(this, EventArgs.Empty);
}
public bool IsDisposed
{
get;
private set;
}
public event EventHandler Disposed;
}
Я пытаюсь предоставить расширение для веб-хостинга WebAPI в течение нескольких недель.
EDIT:
Поддержка самопомощи теперь предоставляется Ninject.Web.WebApi.Selfhosting https://nuget.org/packages/Ninject.Web.WebApi.Selfhost/3.0.2-unstable-0
Пример: https://github.com/ninject/Ninject.Web.WebApi/tree/master/src/Ninject.Web.WebApi.Selfhost