I'm creating an application that has a ASP.NET Web API interface using the Self Hosting approach. I want to use a scope similar to InRequestScope()
provided by MVC3. When I host a Web API application on the IIS this seems to be supported by Ninject.Extension.WebAPI. But when self hosting the WebAPI I get a new instance when I create bindings InRequestScope()
. Is there any way I can use this scope when I self host the web API?
You can use the NamedScope extensions to define that the controller defines a scope and use that scope for everything that is in a request scope. Best you use conventions for this definition:
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);
I recommend to implement INotifyWhenDisposed
for the controllers so that the objects in request scope are immediately released after the request. E.g. by deriving from the following class instead of 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;
}
I try to provide an extension for WebAPI selfhosting somewhen in the comming weeks.
EDIT:
Selfhosting support is now provided by Ninject.Web.WebApi.Selfhosting https://nuget.org/packages/Ninject.Web.WebApi.Selfhost/3.0.2-unstable-0
Example: https://github.com/ninject/Ninject.Web.WebApi/tree/master/src/Ninject.Web.WebApi.Selfhost
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With