2016-05-25 26 views
3

我有一個類需要根據當前認證的用戶設置一個IPrinciple對象。配置簡單的注射器注入當前認證的用戶

我發現,我嘗試了一些其他的代碼,但它不工作:

private readonly Lazy<IPrincipal> _principal; 

public MyService(Lazy<IPrincipal> principal) 
{ 
    _principal = principal; 
} 

我配置簡單的噴油器,像這樣:

container.Register(() => new Lazy<IPrincipal>(() => HttpContext.Current.User)); 

顯然_principal未定義/未設置爲一個當我嘗試運行這個時,一個對象的實例。

我也試過:

container.Register(() => new Lazy<IPrincipal>(() => Thread.CurrentPrincipal)); 

這讓我檢查_principal.Value.Identity.IsAuthenticated但總返回false

回答

8

問題的根源在於在對象圖構造期間將運行時數據注入到組件中。如解釋here,這是一個壞主意。相反,作爲參考文章的建議,您應該延遲請求此運行時數據的決定,直到構建圖之後;此時運行時數據可用。

您可以通過創建自定義IPrincipal實現這樣做:

public class HttpContextPrinciple : IPrincipal 
{ 
    public IIdentity Identity => HttpContext.Current.User.Identity; 
    public bool IsInRole(string role) => HttpContext.Current.User.IsInRole(role); 
} 

而且這樣註冊它:

container.RegisterSingleton<IPrincipal>(new HttpContextPrinciple()); 

這可以讓你直接注入到IPrincipal消費者喜歡MyService。這簡化了消費者,因爲他們不必處理leaky abstractions,例如Lazy<T>

相關問題