因此,我從另一個開發人員手中接管了一個VB.net Web應用程序項目,並發現了迄今爲止編寫的代碼的一個明顯問題。將一個ASP.net Singleton會話實例轉換爲一個對象
開發人員已經構建了基於本教程的購物車應用程序(http://net.tutsplus.com/tutorials/other/build-a-shopping-cart-in-aspnet/)。
注意:要使用這個作爲一個生產ASP.net購物車的基礎上考慮任何開發人員 - 不 - 閱讀,以瞭解更多....
誰寫的教程中實現過的人最近使用Singleton對於基於會話的購物車來說不是一個非常聰明的模式。事實上,它是愚蠢的 - 真的很愚蠢。有了這種模式,每個用戶都有相同的購物車實例!
本教程中有許多有用的評論,關於如何將Singleton實例會話轉換爲對象(如作者:http://net.tutsplus.com/tutorials/other/build-a-shopping-cart-in-aspnet/comment-page-1/#comment-56782)。
但我的應用程序使用VB.net當量(在該網頁上下載文件提供),什麼我不知道是我將需要經過整個應用程序,並轉移到的所有喜歡引用:
ShoppingCart.Instance.AddItem
手動喜歡的東西代替它們:
Dim cart As ShoppingCart = ShoppingCart.GetShoppingCart()
cart.AddItem(3)
或者是有什麼聰明的我可以做CONVER t此代碼:
#Region "Singleton Implementation"
' Readonly variables can only be set in initialization or in a constructor
Public Shared ReadOnly Instance As ShoppingCart
' The static constructor is called as soon as the class is loaded into memory
Shared Sub New()
' If the cart is not in the session, create one and put it there
' Otherwise, get it from the session
If HttpContext.Current.Session("ASPNETShoppingCart") Is Nothing Then
Instance = New ShoppingCart()
Instance.Items = New List(Of CartItem)
HttpContext.Current.Session("ASPNETShoppingCart") = Instance
Else
Instance = CType(HttpContext.Current.Session("ASPNETShoppingCart"), ShoppingCart)
End If
到其他東西,所以我不需要更改實例調用?
例如像這樣的東西(這是我在文章的另一個評論中發現的C#代碼片段 - 我需要一個VB.net等價物,但我不確定如何編寫它 - 我的VB.net有點生疏!)
public static ShoppingCart Instance
{
get
{
ShoppingCart c=null;
if (HttpContext.Current.Session["ASPNETShoppingCart"] == null)
{
c = new ShoppingCart();
c.Items = new List();
HttpContext.Current.Session.Add(「ASPNETShoppingCart」, c);
}
else
{
c = (ShoppingCart)HttpContext.Current.Session["ASPNETShoppingCart"];
}
return c;
}
}
感謝您提供任何幫助。
埃德
哪些存儲選項?這是全部在內存中,還是由SQL等支持...? – bryanmac
@bryanmac足夠公平:)我不故意不接受答案。 –
@bryanmac - 我卡與INPROC(內存) - 我有一個CMS僅支持INPROC(它不能序列顯然會話數據)約.Instance沒有改變 –