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