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?

War es hilfreich?

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 IFilesRepositorys 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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top