在自托管 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 时,有什么方法可以使用这个范围?
可以使用 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