2014-02-06 10 views
7

Ich habe begonnen, Simple Injector als meinen DI-Container zu verwenden (meistens aus Performance-Gründen: wenn jemand Vorschläge hat, lass es mich wissen), aber einige der Klassen, die ich geschrieben habe, benutzen HttpContextBase als Konstruktorparameter. Ich habe jetzt beschlossen, sie aus dem Konstruktor entfernt und eine Eigenschaft, so etwas wie dies zu schaffen:Simple Injector: Wie injiziere ich HttpContext?

public HttpContextBase HttpContext 
    { 
     get 
     { 
      if (null == _httpContext) 
       _httpContext = new HttpContextWrapper(System.Web.HttpContext.Current); 
      return _httpContext; 
     } 
     set 
     { 
      _httpContext = value; 
     } 
    } 

aber ich weiß nicht, diese Lösung gefällt ... irgendwelche Ratschläge?

Antwort

22

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.Currentnull 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.

+0

Ich fühle mich so dumm ... Ihre Lösung funktioniert perfekt, danke! – MizRaeL