1

我有一個使用Entity Framework 4的MVC4應用程序,它使用了存儲庫模式。一旦用戶登錄後,他們可以在數據庫層上執行CRUD操作,並且所有信息都被保存並鏈接到特定用戶。現在我也想讓這些功能可供未登錄的用戶使用,以便他們可以嘗試應用程序。一旦他們決定訂閱,我想保存他們在嘗試中創建的數據,就像數據庫中登錄的用戶一樣。如何存儲每個會話未登錄用戶的數據?

該應用程序的設置是將實體框架數據庫上下文抽象爲IContext後面。這意味着可以使用IContext的另一個實現。我使用Autofac作爲DI容器。 (如果您覺得您需要更多關於安裝的信息,所有代碼可以在here找到)。

我正在尋找一種實現試用功能的好方法。我想到的是:

  1. 每個用戶使用一個「內存」數據庫,但我認爲這可能會佔用太多的內存太多的用戶存在。
  2. 另一個想法是將數據存儲在客戶端(JavaScript)中並在註冊後保存所有信息,但這似乎需要大量重寫,並且所有C#邏輯都需要轉換爲JavaScript並一起維護(一旦C#發生更改, JavaScript必須改變)。
  3. 保存數據庫中的數據以獲得特定於會話的隨機UserId,但是一旦用戶註銷,請刪除與「UserId」相關的所有數據。

也許有更好的方法。我希望如果你有一個實現嘗試功能的好主意,你會願意與我分享。

在此先感謝。

+0

您可以使用其他數據庫?如果是的話,你可以創建另一個數據庫'可播放',因爲這個數據庫不是針對實際用戶的。如果開始佔用大量內存可以回滾。如果用戶想要註冊,則可以在實際數據庫中移動他的數據。 – adricadar

+0

我剛剛爲我正在開發的應用程序提供了第三個選項,我認爲它是一個不錯的選擇,因爲它不會增加額外開銷。 – martinoss

+0

@adricadar,是的,我可以使用另一個數據庫!然後爲未登錄的用戶使用不同的上下文(使用另一個連接字符串),並有另一個服務和邏輯的實現,這取決於登錄的用戶? :-)聽起來像是一種方式。謝謝。 –

回答

1

如果可以,創建另一個數據庫爲'可播放',因爲此數據庫不是針對實際用戶的。如果開始佔用大量內存,則可以無風險地回滾。當用戶想要註冊時,可以將其數據從該數據庫移至生產數據庫。

注意:您不需要使用不同的上下文或實現其他服務。您可以使用上下文的新實例,但使用不同的連接字符串。

+0

嗯,你能解釋一下,我可以如何使用上下文/不同連接字符串的不同實例取決於用戶是否登錄?而當用戶註冊數據需要從一個到另一個複製。我找到了[一篇文章](http://www.codeproject.com/Articles/137853/Cloning-the-Entity-object-and-all-related-children),它解釋瞭如何做到這一點,這是可能的。唯一的問題是使用其他連接字符串。謝謝。 –

+0

@ErwinRooijakkers由於用戶只有在使用生產數據庫時纔會被認證,所以您可以檢查User.Identity.IsAuthenticated並在此基礎上決定上下文,如果您使用自定義登錄系統,則可以將其存儲在Session中'該用戶是否登錄。如果無論用戶使用什麼上下文,都必須認證用戶,您可以在'Session'中存儲該用戶必須使用上下文或另一個上下文,並且當他嘗試註冊/登錄時,他將使用*生產上下文*。除了在Ctor或Factory中註冊或登錄make context切換外,不要嘗試在您的操作中添加if/else。 – adricadar

1

我會讓試用用戶註冊非常簡單(如果我想稍後發送更多信息,只需輸入名稱和密碼和/或電子郵件),然後刪除在一段時間後未完成完整註冊過程的用戶

+0

感謝您的回答,但我認爲我會因爲沒有嘗試而嚇跑很多潛在用戶。所以不這樣做不是一種選擇。 –

1

你最簡單的路徑是第三種選擇。在數據庫中爲未登錄的用戶創建臨時用戶記錄。如果您使用cookie來識別返回的用戶,那麼當這些用戶返回時,它將無縫工作。在數據庫記錄中有一些區別,以便您可以偶爾清除臨時用戶。