MVC 3 ninject bind faul ausgewerteter Parameter
-
27-10-2019 - |
Frage
Ich möchte meinen Controller mit einem Parameter verbinden, der verzögert ausgewertet wird.
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
try
{
return controllerType == null
? null
: (IController) _ninjectKernel.Get(controllerType);
}
catch (Exception ex)
{
throw;
}
}
Und ich habe die nächste Bindung:
_ninjectKernel.Bind<IFilesRepository>().To<FilesManager>().WithConstructorArgument("storageFolderAbsolutePath", c => c.ToString());
Das Problem liegt bei der Lambda-Funktion.Ich möchte Server.MapPath ("/") zurückgeben ... aber ich habe den Anforderungskontext nicht im c-Objekt.Wie kann ich es senden?
Lösung
Ich bin mit Ninject nicht allzu vertraut, aber Sie sollten in der Lage sein, einen Anbieter für den Container zu registrieren, um einen HttpContextBase
auflösen zu können.Auf diese Weise kann der IFilesRepository
jetzt einen HttpContextBase
als Konstruktorargument verwenden, das vom Container mithilfe des Anbieters beim Erstellen einer Instanz von IFilesRepository
eingefügt wird.
Um einen Anbieter zu registrieren (mit einem Delegaten, um den Dienst aufzulösen),
Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current));
Beachten Sie jedoch, dass sich der Lebensstil eines IFilesRepository
s höchstwahrscheinlich in einen Lebensstil "pro Webanforderung" ändern muss, da der HttpContext.Current
pro Webanforderung erstellt wird, sodass Sie nicht daran festhalten möchtenein IFilesRepository
, der einen längeren Lebensstil hatte.Möglicherweise möchten Sie die Funktion "Zuordnungspfade" abstrahieren, damit Sie einen IFilesRepository
mit einem längeren Lebensstil erhalten.
Andere Tipps
Da die Servervariable mit dem aktuellen HttpContext verknüpft ist, müssen Sie sie innerhalb der FilesManager-Klasse abrufen (wenn Sie möchten, verwenden Sie dazu eine separate Schnittstelle)