Sollte ich OwinContext Umgebung zu halten anwendungsspezifische Daten pro Anfrage

Ich brauche einen Weg, um ein logging-Objekt pro Anfrage. Mit HttpContext ich würde gerne noch etwas hinzufügen, um die Elemente Dictionary. Ich will nicht zu bringen HttpContext in diesem, wenn ich helfen kann.
Der code unten ist, was ich Vorschlage, für eine Einheit LifeTimeManager speichern der Objekte in OwinContext Umgebung Eigenschaft, die ich zur Verfügung habe, um mit meine Owin-middleware.

public class OwinContextLifetimeManager : LifetimeManager
{
    private string key = (new Guid()).ToString();
    private IDictionary<string, object> environment;

    public OwinContextLifetimeManager(IDictionary<string, object> environment)
    {
        this.environment = environment;
    }

    public override object GetValue()
    {
        if (environment != null && environment.ContainsKey(key))
            return environment[key];
        else
            return null;
    }

    public override void RemoveValue()
    {
        if (environment != null)
            environment.Remove(key);
    }

    public override void SetValue(object newValue)
    {
        if (environment != null)
            environment[key] = newValue;
    }
}

Dann kann ich es verwenden, wie dies von meinem middleware:

container.RegisterType<IRequestLog, RequestLog>(new OwinContextLifetimeManager(environment));

Fällt mir ein, dass ich wählen kann, was Schlüssel ich will, außer diejenigen, die bereits reserviert sind Owin.
Gibt es irgendeinen Grund, warum ich, sollten Sie nicht verwenden die OwinContext.Umwelt für diesen Zweck? Die MSDN-Dokumentation ist vage auf den best practices von diesem.

Darrel Miller ' s Antwort hier: Wie Lagere ich pro Anfrage Daten bei der Nutzung von OWIN Selbst Hosten ASP.NET Web-API führt mich zu glauben, dass die properties-Auflistung des request-Objekts ist der Weg zu gehen. Wie kann ich Zugriff auf dieses Objekt von middleware?

Ich habe deine bearbeiteten Titel. Bitte sehen, "Sollten Fragen enthalten "tags" im Titel?", wo der Konsens ist ", Nein, Sie sollten nicht".
Ich weiß, das ist eine alte Frage, aber ich möchte nur zu beachten, wo generieren Sie Ihre Schlüssel new Guid() sollte Guid.NewGuid(). new Guid() erstellt eine leere guid (alle Nullen - Guid.Empty) jedes mal.
Gut zu wissen. Stellt sich heraus, da speichert er es in den Kontext der Anfrage, ich habe gerade verwendet eine Konstante anstelle von speichern eine ID haben.

InformationsquelleAutor codetoast | 2014-12-08

Schreibe einen Kommentar