在自托管 Web API 时使用 Ninjects InRequestScope()

本文关键字:Ninjects InRequestScope Web API | 更新日期: 2023-09-27 18:31:12

我正在使用自托管方法创建一个具有 ASP.NET Web API 接口的应用程序。我想使用类似于 MVC3 提供的范围InRequestScope()。当我在IIS上托管Web API应用程序时,Ninject.Extension.WebAPI似乎支持这一点。但是当自托管 WebAPI 时,当我创建绑定时,我会得到一个新实例InRequestScope()。当我自托管 Web API 时,有什么方法可以使用这个范围?

在自托管 Web API 时使用 Ninjects InRequestScope()

可以使用 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 自托管提供一个扩展。

编辑:

自托管支持现在由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