2016-02-12 69 views
-1

我有一個asp.net mvc應用程序,其中很多事情都依賴於瞭解Web請求(它是多租戶)的URL。目前,HttpContext正在使用Simple Injector注入許多構造函數(通過基於上下文設置一些變量的包裝器)。這意味着大多數事情必須按照「每個Web請求」與每個應用程序進行實例化。依賴注入攻擊Web應用程序實例性能

現在我可以在這裏做的只是傳遞HttpContext包裝器,或者只傳遞所需的數據,而不是構造器注入。

我想知道的是實際的性能差異。因爲它確實使它總是傳遞包裝器/數據而不夠優雅。然而,這是一個相當高流量的網站,所以我一定會考慮改變它。

我意識到這取決於構造函數中發生了什麼,但假設它所做的只是分配依賴關係。

澄清我沒有特定的性能問題。這只是優化,我想知道是否值得通過重構的工作來實現這一點。

+0

難道你'HttpContext',包裝包含數據,或邏輯檢索,只要屬性或方法被稱爲數據?如果是後者,那麼每個Web請求都不需要實例化;您可以使用單個實例(因爲它將使用場景後面的HttpContext.Current)。 – Maarten

+0

所以你所說的是你[注入運行時數據到你的組件](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99)。 – Steven

+0

我在這裏缺少數字和事實。這是假設的還是你有性能問題?你測過它了嗎?你有沒有對其進行分析以找出問題所在?沒有這些信息,我很想關閉這個問題。 – Steven

回答

1

不僅僅是一個包裝,你可以在兩者之間放置一個提供者,你可以是單身人士,這使得所有消費者都可以成爲單身人士。

像這樣:

public interface IHttpContextProvider 
{ 
    HttpContext CurrentContext { get; } 
} 

public class HttpContextProvider : IHttpContextProvider 
{ 
    public HttpContext CurrentContext => HttpContext.Current; 
} 

public interface IMyContextWrapper 
{ 
    string CurrentRoute { get; } 
} 

public class MyContextWrapper : IMyContextWrapper 
{ 
    private readonly IHttpContextProvider httpContextProvider; 

    public MyContextWrapper(IHttpContextProvider httpContextProvider) 
    { 
     this.httpContextProvider = httpContextProvider; 
    } 

    public string CurrentRoute 
    { 
     get 
     { 
      var context = this.httpContextProvider.CurrentContext; 
      return informationFromContext; 
     } 
    } 
} 
+0

除非此提供者的消費者包含狀態,而不僅僅是邏輯。 – Maarten

+0

是的,我不認爲這適用於我,因爲我基於上下文在我的包裝中設置了一堆東西。那麼,每次使用我想避免的時候,我都必須這樣做。 – JuhaKangas

+0

在這種情況下,來自@Steven的評論適用,您是[將運行時數據注入您的組件](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99),它是基礎你現在的問題 –

0

我會試圖堅持構造函數注入,因爲它清楚地顯示了依賴關係。的確,可能會有小的性能下降,因爲您必須使用per-web-request,而且如果您將上下文作爲參數傳遞,這將涉及更多的垃圾回收。但是,它有沒有成爲一個問題?

如果你發現這是一個性能問題,你可以看看第三個選項,提供你的租戶數不是很大。您可以實例化並重新使用單個類的池,其中每個類都是爲每個租戶配置的。

我已經構建了一個多租戶網站,並且需要爲每個Web請求創建某些服務,並且在該領域絕對沒有出現性能問題。

+0

我添加了一個編輯,這主要是一個優化問題,我沒有特定的性能問題。 – JuhaKangas

+0

當然,我明白了。這就是爲什麼我建議在代碼中做最自然的事情,而不是優化你沒有問題的地方。 –

+0

是的,我寧願構造器注入,但我更多地尋找一個性能差異的答案。 – JuhaKangas