Sto creando un'applicazione con un'interfaccia API Web ASP.NET che utilizza l'approccio Self Hosting. Voglio utilizzare un ambito simile a InRequestScope()
fornito da MVC3. Quando eseguo l'hosting di un'applicazione API Web su IIS, questa sembra essere supportata da Ninject.Extension.WebAPI. Ma quando self hosting WebAPI ottengo una nuova istanza quando creo i binding InRequestScope()
. Esiste un modo per utilizzare questo ambito quando eseguo autonomamente l'API Web?Utilizzo di Ninjects InRequestScope() durante l'API Web di selfhosting
risposta
È possibile utilizzare le estensioni NamedScope per definire che il controller definisce un ambito e utilizzare tale ambito per tutto ciò che è nell'ambito di una richiesta. Miglior si utilizza convenzioni per questa definizione:
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);
vi consiglio di implementare INotifyWhenDisposed
per i controllori in modo che gli oggetti in richiesta di applicazione vengono immediatamente rilasciati dopo la richiesta. Per esempio. derivando dalla seguente classe invece di 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;
}
provo a fornire un'estensione per WebAPI selfhosting somewhen nelle settimane comming.
EDIT:
Selfhosting supporto è ora fornita da Ninject.Web.WebApi.Selfhosting https://nuget.org/packages/Ninject.Web.WebApi.Selfhost/3.0.2-unstable-0
Esempio: https://github.com/ninject/Ninject.Web.WebApi/tree/master/src/Ninject.Web.WebApi.Selfhost
Sembra che ora c'è un'estensione che Ninject.Web.WebAPI supporta questo, ma attualmente non è elencato su http://www.ninject.org/extensions.html? Quella pagina è obsoleta e dovrebbe reindirizzare altrove o deve essere semplicemente aggiornata? se quest'ultimo è la fonte di quella pagina su github e posso inviare una richiesta di pull per dare una mano? Grazie mille, Remo !! Tu e ninject rock :) –
L'uso degli scope nominati in questo modo non supporta ActionFilters –