2011-09-20 84 views
1

我寫了一個asp.net網站。 我有一個BLL項目(意思是DLL類型項目) 其中我想保存一些數據爲會話靜態。如何保存會話BLL的變量?

我該怎麼辦?如果我將它們聲明爲靜態,它們對於應用程序將是靜態的。 有沒有辦法避免將它們保存在asp.net會話字典中(我不想讓這個站點負擔,它畢竟在BLL中)。

TIA

回答

2

會話是存儲此數據的正確位置。

要在BLL中使用它,您可以從會話中抽象並創建某種類型的UserStore,從而隱藏實現。這可以通過DI注入,可能使用IoC容器。

更簡單的方法是在構造BLL對象或調用方法時傳遞對當前HttpContext或會話的引用。理想情況下,您可以使用abstractions庫來保持其可測試性。

+1

+1,但是,我建議避免直接引用業務層中的System.Web程序集。使用UserStore等自定義抽象是一個更好的主意。 – VinayC

+0

是的,我只是補充了關於抽象lib的一點。 – TheCodeKing

1

可以使用HttpContext.Current.Session屬性。

0

下面是這一個體面的文章:Fast, Scalable, and Secure Session State Management for Your Web Applications

優化序列化(從上面鏈接的文章)

...

在設計你的會話對象模型,避免存儲對象在會話中輸入 。相反,僅在會話 字典中存儲基本類型,並根據會話數據在每個 請求上重建您的業務層會話對象。這避免了使用BinaryFormatter的開銷。

...

1

爲什麼不創建一個業務對象來保存數據,並分配給會話?

public class UserSettings 
{ 
    public string Name { get; set; } 
    public string Company { get; set; } 
    public int UserId { get; set; } 
    public int CompanyId { get; set; } 
} 

// Assign 
HttpContext.Current.Session["UserSettings"] = 
    new UserSettings() { 
     UserName = "Bruno Alexandre", 
     UserId = 123, 
     Company = "StackOverflow Inc.", 
     CompanyId = 321 
    }; 

// retrieval: check for nulls 
UserSettings userSettings = 
    HttpContext.Current.Session["UserSettings"] == null ? null : (UserSettings)HttpContext.Current.Session["UserSettings"]; 

... 

Save(DateTime.UtcNow, userSettings.UserId); 
1

什麼每個用戶會話重構您BLL的方式,你可以創建一些業務條目對象(商業門面)的一個實例?

用這種方法你不需要靜態數據。您可以將您的數據保存在類字段/屬性中。

您將在ASP.NET會話中爲每個會話存儲一個實例,並且BLL根本不知道會話。