【问题标题】:Storing Temp. Data in ASP.NET Core (NopCommerce)储存温度ASP.NET Core (NopCommerce) 中的数据
【发布时间】:2021-01-22 10:41:51
【问题描述】:

尊敬的 StackOverflow 社区,

对于我的一个项目,我需要将(临时)数据存储在数据库以外的其他地方。其实它有点复杂。我在 NopCommerce 中有一个结帐页面,用户可以在其中选择交货时间甚至位置,例如取货。在用户付款之前,这些数据必须临时存储。只有这样我才会请求数据并存储在数据库中。以便稍后我可以检索数据并显示在我的仪表板中,以便我知道包裹何时发货。

要求:

  • 持续时间:12-24 小时。
  • 存储为用户特定数据。
  • 必须在很多会话中保护数据。取决于用户。例如。如果用户选择了交货时间,但想在付款前查看其他地方。这些数据必须存储在所有这些会话中。
  • 如果可能,服务器端。

在 Microsoft 之后,我有很多选择: Session and state management in ASP.NET Core

现在我尝试使用“MemoryCacheEntryOptions”将数据存储在内存中(缓存数据)。问题在于它的应用范围很广。并且很难维护数百个用户。

其他选项是'会话状态'。 问题是这些数据只存在一个会话。我需要将数据保存至少 12 到 24 小时。

然后我们有'临时数据'。这似乎是一个很有前途的选择。它很棒,因为它一直保存到它被使用/读取。您甚至可以使用“Peek”和“Keep”方法在查看时保留数据。问题:它需要一个控制器。而请求数据是一个回调方法,不需要Controller。

'Query Strings' 那么它不多,不是吗?这可能不是用户关键数据,但似乎查询字符串不是我要找的。​​p>

'隐藏字段'也不太适合。因此它不是表单数据。

'HttpContext.Items' 绝对不适合。数据仅针对单个请求存储。

“缓存”很难维护用户特定数据。

所以我的问题是。如果可能的话,如何将所有这些数据临时保存在服务器端至少一天,同时有数百名用户。并稍后在回调中请求数据,将其存储在 DB 中,直到订单发货。

【问题讨论】:

  • 为什么不使用不同的数据库来存储临时数据?但另一种选择是将文件写入具有特定 ID 的磁盘?
  • 临时数据库可能不是一个坏主意。我已经考虑过了。但是我必须安排在 x 时间后清除数据库数据的任务。文件到磁盘?而不是。
  • 清除数据库表可以通过代理中的作业完成
  • de Agent 的工作是什么意思?
  • SQL Server 有一个 SQL Server 代理(不在 Express 中)。在那里你可以安排备份、执行存储过程等。

标签: asp.net caching nopcommerce tempdata


【解决方案1】:

NopCommerce 在 Nop.Services.Common 中公开了一个名为 GenericAttributeService 的类。这允许您存储特定于每个客户的自定义属性数据。

要使用它,首先将 GenericAttributeService 注入您的类(控制器、服务类等)。

private readonly IGenericAttributeService _genericAttributeService;
public MyFancyController(IGenericAttributeService genericAttributeService)
{
   _genericAttributeService = genericAttributeService;
}

要保存当前客户的数据,请使用 SaveAttribute 并保存您需要的键值对:

 _genericAttributeService.SaveAttribute<string>(_workContext.CurrentCustomer, "MyKeyName", "Value to save for this customer")
 _genericAttributeService.SaveAttribute<int>(_workContext.CurrentCustomer, "My2ndKeyName", model.id)

要获取数据,请使用 GetAttributesForEntity,其中实体是您的键值。

var attribute = _genericAttributeService.GetAttributesForEntity(_workContext.CurrentCustomer.Id, "Customer").Where(x => x.Key == "MyKeyName").FirstOrDefault();

要删除属性,请使用 DeleteAttribute:

_genericAttributeService.DeleteAttribute(attribute);

请注意,我们使用了 _workContext,它有助于暴露当前客户。 这已经与应用程序中已经存在的其他临时功能很好地配合,例如管理购物车、愿望清单等,因此浏览其他示例的源代码也很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2018-09-25
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多