2012-04-09 63 views
0

我目前有一種類型,我注入到我的控制器,用於獲取和設置會話數據。消除靜態屬性 - 我可以使用哪些模式?

我使用這個,所以我可以獲得相關的會話信息爲_sessionData.Username而不是使用Session["username"]

我想在所有的視圖中使用這個會話信息和而以前這通過使SessionData成員,而不是靜態的SessionData類注射到我的控制器做到了這一點。

我想避免使用靜態成員以及具有與對象傳遞給每個控制器中圖。

什麼模式最適合這種類型的場景?你如何解決這個問題?

回答

0

爲什麼不直接使用Session [ 「用戶名」]?你可以用靜態調用在一個實例是這樣的:

public class MySessionClass 
{ 
    public string GetSessionValue(String value) 
    { 
     return Session[value]; 
    } 
} 

你獲得,然後可以在測試被嘲笑實例的維護和靈活性,而無需重新

改寫會話類UPDATE

至於在你的視圖中使用你的實例,是什麼阻止你寫一個代碼塊,並且使用它呢?您應該能夠像MVC中的其他代碼塊一樣針對它編寫代碼。 但是,我會建議不要這樣做,因爲它會破壞分層架構的目的。您可以直接訪問會話,就像使用任何HTML頁面一樣,也可以將其作爲控制器中的對象傳遞。

+0

我更喜歡在會話中確切地知道我可以訪問的內容,而不是使用魔術鍵字符串。我的SessionData類幾乎完成了你上面的方法。問題是,如何在不使其靜態的情況下在我的視圖中使用它? – 2012-04-09 11:13:13

+0

@JamieDixon對不起,我錯過了,並更新了我的答案。 – 2012-04-09 11:26:39

+0

謝謝賈斯汀。到目前爲止,我所知道的所有解決方案似乎都非常優雅。訪問靜態類成員,使用魔術字符串直接訪問會話對象,在視圖中創建對象。必須有一種更優雅的方式來訪問大量視圖中的共享信息。也許使用基本控制器將自定義Session類插入到每個請求的視圖包中。 – 2012-04-09 11:37:28

0

依賴注入會幫助你在這裏。採取任何依賴注入框架並將其與您的MVC應用程序集成。例如,要將Ninject集成到您的MVC應用程序中,請參閱blog post

一旦你整合你應用程序的DI框架。使用DI框架註冊SessionData類。根據您的場景選擇SessionData類的有效生存期。如果你看看這些DI框架,他們提供多種生命週期配置,例如每個呼叫實例,每個會話,單例。

現在注入任何你想去的地方SessionData依賴。對於控制器,你可以創建一個包含這種依賴作爲公共財產BaseController如

[Inject] 
public SessionData SessionContext {get;set;} 

對於你需要看看路過strongly typed model視圖的一部分。這個過程在這裏是類似的。創建一個BaseModel,在這裏保留一個SessionData屬性,DI框架應該完成剩下的工作。這裏的最後一步是將此模型傳遞給每個呈現的視圖。

+0

請參閱我的回答和評論,這是已經建議,OP是不滿意的。 – 2012-04-09 11:56:19

+0

謝謝@Chandermani。我已經在使用依賴注入,正如Justin所說,他已經介紹了將數據傳遞給視圖的大多數已知方法。如果您想了解更多信息,請查看我對他答案的評論。我的問題可能有點不清楚。 – 2012-04-09 12:11:49

相關問題