您應該始終偏愛構造函數注入。這幾乎總是可能的。可以按如下方式註冊您的HttpContextBase
:
container.Register<HttpContextBase>(() =>
new HttpContextWrapper(HttpContext.Current),
Lifestyle.Scoped);
這可以調用Verify()
的時候,因爲在應用程序啓動HttpContext.Current
是null
導致一個問題,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。
我覺得很蠢......你的解決方案完美無缺,謝謝! – MizRaeL