Подтвердить что ты не робот

Использование Ninjects InRequestScope() при использовании веб-API для самопомощи

Я создаю приложение, имеющее интерфейс веб-API ASP.NET, используя подход Self Hosting. Я хочу использовать область, похожую на InRequestScope(), предоставленную MVC3. Когда я размещаю приложение веб-API в IIS, это, по-видимому, поддерживается Ninject.Extension.WebAPI. Но когда я сам размещаю WebAPI, я получаю новый экземпляр, когда создаю привязки InRequestScope(). Есть ли способ использовать эту область, когда я сам размещаю веб-API?

4b9b3361

Ответ 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