我寫了一個asp.net網站。 我有一個BLL項目(意思是DLL類型項目) 其中我想保存一些數據爲會話靜態。如何保存會話BLL的變量?
我該怎麼辦?如果我將它們聲明爲靜態,它們對於應用程序將是靜態的。 有沒有辦法避免將它們保存在asp.net會話字典中(我不想讓這個站點負擔,它畢竟在BLL中)。
TIA
我寫了一個asp.net網站。 我有一個BLL項目(意思是DLL類型項目) 其中我想保存一些數據爲會話靜態。如何保存會話BLL的變量?
我該怎麼辦?如果我將它們聲明爲靜態,它們對於應用程序將是靜態的。 有沒有辦法避免將它們保存在asp.net會話字典中(我不想讓這個站點負擔,它畢竟在BLL中)。
TIA
會話是存儲此數據的正確位置。
要在BLL中使用它,您可以從會話中抽象並創建某種類型的UserStore,從而隱藏實現。這可以通過DI注入,可能使用IoC容器。
更簡單的方法是在構造BLL對象或調用方法時傳遞對當前HttpContext或會話的引用。理想情況下,您可以使用abstractions庫來保持其可測試性。
可以使用HttpContext.Current.Session
屬性。
下面是這一個體面的文章:Fast, Scalable, and Secure Session State Management for Your Web Applications
優化序列化(從上面鏈接的文章)
...
在設計你的會話對象模型,避免存儲對象在會話中輸入 。相反,僅在會話 字典中存儲基本類型,並根據會話數據在每個 請求上重建您的業務層會話對象。這避免了使用BinaryFormatter的開銷。
...
爲什麼不創建一個業務對象來保存數據,並分配給會話?
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);
什麼每個用戶會話重構您BLL的方式,你可以創建一些業務條目對象(商業門面)的一個實例?
用這種方法你不需要靜態數據。您可以將您的數據保存在類字段/屬性中。
您將在ASP.NET會話中爲每個會話存儲一個實例,並且BLL根本不知道會話。
+1,但是,我建議避免直接引用業務層中的System.Web程序集。使用UserStore等自定義抽象是一個更好的主意。 – VinayC
是的,我只是補充了關於抽象lib的一點。 – TheCodeKing