Ich lief gerade in genau das gleiche Problem, aber meine Lösung ist etwas anders.
Schnittstelle:
public interface IHttpContextProvider
{
/// <summary>
/// Gets the current HTTP context.
/// </summary>
/// <value>The current HTTP context.</value>
HttpContextBase Current { get; }
}
Umsetzung:
/// <summary>
/// A default HTTP context provider, returning a <see cref="HttpContextWrapper"/> from <see cref="HttpContext.Current"/>.
/// </summary>
public class DefaultHttpContextProvider : IHttpContextProvider
{
public HttpContextBase Current
{
get { return new HttpContextWrapper(HttpContext.Current); }
}
}
melde ich mich dann auf die IHttpContextProvider
als Singleton in den Behälter. Ich bin immer noch ein Anfänger, wenn es um DI geht, also bin ich vielleicht etwas komplizierter, aber von dem, was ich verstehe, kann ich keine Singleton-Komponenten von PerWebRequest Lifestyle-Komponenten abhängig machen, was sinnvoll ist (aber das ist, was alle Beispiele tun). In meiner Lösung bin ich auf HttpContext.Current
in einer isolierten Komponente angewiesen und ich bin nicht daran interessiert, das zu testen. Aber jede Komponente, die Zugriff auf den HTTP-Kontext benötigt, kann dies erreichen, indem sie von IHttpContextProvider
abhängig ist und dies bei Bedarf leicht nachahmen kann.
Bin ich wirklich über komplizierter Dinge oder gibt es irgendwelche Vorbehalte in meiner Lösung?
Mark, danke für die Info - Ich wusste nicht über PerWebRequest. Ich werde das überprüfen. –
Mark, ich habe in PerWebRequest untersucht, aber ich sehe immer noch nicht, wie Dienste HttpContext erhalten können. Wenn ich versuche, eine Instanz von HttpContextBase im Container selbst zu registrieren, schlägt sie nach der zweiten Anfrage fehl (da in der vorherigen Anfrage bereits eine Instanz registriert war). Ich konnte bisher nichts bei Google finden ... –
Ich habe vielleicht missverstanden, was Sie versuchen zu tun, aber Sie können nicht den HttpContext von Application_Start verwenden, weil an dieser Stelle * kein HttpContext (PerWebRequest oder kein PerWebRequest) ist). Nun, da ich darüber nachdenke, macht es keinen Sinn zu versuchen, die Lebensdauer des HttpContext vom DI Container zu kontrollieren, da diese Lebensdauer bereits vom ASP.NET MVC Framework verwaltet wird.Was Sie * tun * können, ist, sich in eine benutzerdefinierte IControllerFactory einzuklinken und den HttpContext abzufangen, der zu diesem Zeitpunkt an Sie geliefert wurde, und dann eine Factory-Methode zu verwenden, um alles andere, das davon abhängt, zu verkabeln. –