2014-02-06 63 views
7

我已經開始使用Simple Injector作爲我的DI容器(主要是出於性能的原因:如果有人有建議,請告訴我)但我寫的一些類使用HttpContextBase作爲構造函數參數。 我已經解決了,現在從構造函數中刪除,並創建一個屬性,是這樣的:簡單的注射器:如何注入HttpContext?

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

,但我不喜歡這種解決方案有何意見?

回答

22

您應該始終偏愛構造函數注入。這幾乎總是可能的。可以按如下方式註冊您的HttpContextBase

container.Register<HttpContextBase>(() => 
    new HttpContextWrapper(HttpContext.Current), 
    Lifestyle.Scoped); 

這可以調用Verify()的時候,因爲在應用程序啓動HttpContext.Currentnull導致一個問題,HttpContextWrapper不允許空傳遞到構造函數。

它總是好的嘗試keep your configuration verifiable,你可以在登記更改爲以下:

container.Register<HttpContextBase>(() => 
{ 
    var context = HttpContext.Current; 
    if (context == null && container.IsVerifying) return new FakeHttpContext(); 
    return new HttpContextWrapper(context); 
}, 
    Lifestyle.Scoped); 

FakeHttpContext是一個空HttpContextBase執行預防萬一容器檢驗返回null。該FakeHttpContext很簡單:

public class FakeHttpContext : HttpContextBase { } 

做然而要注意的HttpContext是運行系統數據和injecting runtime data into components during construction is an anti-pattern。您應該創建一個特定於應用程序的抽象,爲消費者提供實際需要的內容(例如用戶標識或租戶標識),而不是將HttpContext或任何抽象注入到組件中。這種抽象的實現可以簡單地在內部調用HttpContext.Current,這完全防止了需要注入HttpContext。

+0

我覺得很蠢......你的解決方案完美無缺,謝謝! – MizRaeL

相關問題