Sie sollten Konstruktorinjektion gegenüber allem anderen bevorzugen. Dies ist fast immer möglich. Sie können Ihre HttpContextBase
registrieren Sie wie folgt vor:
container.Register<HttpContextBase>(() =>
new HttpContextWrapper(HttpContext.Current),
Lifestyle.Scoped);
dies ein Problem verursachen kann, wenn Verify()
Aufruf, da beim Start der Anwendung HttpContext.Current
null
ist, und HttpContextWrapper
erlaubt nicht null in den Konstruktor übergeben.
Es ist immer gut zu keep your configuration verifiable, um zu versuchen, und Sie können, dass die Registrierung wie folgt ändern:
container.Register<HttpContextBase>(() =>
{
var context = HttpContext.Current;
if (context == null && container.IsVerifying) return new FakeHttpContext();
return new HttpContextWrapper(context);
},
Lifestyle.Scoped);
FakeHttpContext
ist eine leere HttpContextBase
Implementierung Rückkehr null
zu verhindern, falls der Behälter zu überprüfen. Die FakeHttpContext
ist einfach:
public class FakeHttpContext : HttpContextBase { }
Anmerkung jedoch tun, dass Httpcontext Laufzeitdaten und injecting runtime data into components during construction is an anti-pattern. Anstatt den HttpContext oder eine Abstraktion darüber in Ihre Komponenten zu injizieren, sollten Sie eine anwendungsspezifische Abstraktion erstellen, die dem Benutzer das bietet, was er tatsächlich benötigt (z. B. eine Benutzeridentität oder Mandanten-ID). Die Implementierung dieser Abstraktion kann einfach HttpContext.Current intern aufrufen, was die Notwendigkeit für die Injektion von HttpContext vollständig verhindert.
Ich fühle mich so dumm ... Ihre Lösung funktioniert perfekt, danke! – MizRaeL