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来识别返回的用户,那么当这些用户返回时,它将无缝工作。在数据库记录中有一些区别,以便您可以偶尔清除临时用户。