Ho bisogno di un modo per memorizzare un oggetto di registrazione per richiesta. Con HttpContext vorrei aggiungere questo agli elementi dizionario. Non voglio portare HttpContext in questo se posso aiutarlo. Il codice seguente è quello che propongo per Unity LifeTimeManager che memorizzerà oggetti nella proprietà Environment di OwinContext, a cui ho accesso con il mio middleware Owin.Devo utilizzare l'ambiente di OwinContext per conservare i dati specifici dell'applicazione per richiesta
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;
}
}
Allora posso usare in questo modo dal mio middleware:
container.RegisterType<IRequestLog, RequestLog>(new OwinContextLifetimeManager(environment));
Mi viene da pensare che io possa scegliere ciò che voglio chiave ad eccezione di quelli che già sono riservati per Owin. C'è qualche ragione per cui non dovrei usare OwinContext.Environment per questo scopo? La documentazione MSDN è vaga sulle migliori pratiche di questo.
La risposta di Darrel Miller qui: How should I store per request data when using OWIN to Self-Host ASP.NET Web API mi porta a credere che la raccolta delle proprietà sull'oggetto richiesta sia la strada da percorrere. Come posso accedere a questo oggetto dal middleware?
Ho modificato il titolo. Per favore vedi, "[Le domande dovrebbero includere" tag "nei loro titoli?] (Http://meta.stackexchange.com/questions/19190/)", dove il consenso è "no, non dovrebbero". –
So che questa è una vecchia domanda, ma mi piacerebbe solo annotare dove si genera la propria chiave 'nuovo Guid()' dovrebbe essere 'Guid.NewGuid()'. 'new Guid()' crea un guid vuoto (tutti gli zeri - 'Guid.Empty') ogni volta. –
Buono a sapersi. Risulta dal momento che lo salva nel contesto della richiesta, ho appena usato una costante invece di salvare un ID. – codetoast