在ASP中存储Temp. Data. NET Core (NopCommerce)



亲爱的StackOverflow社区,

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

要求:

  • 持续时间:12-24小时。
  • 存储为用户特定数据
  • 数据在相当多的会话中必须是安全的。这取决于用户。为例。如果用户选择了一个交付时刻,但决定在付款前看看其他地方。这些数据必须存储在所有会话中。
  • 如果可能的话。

我有相当多的选择以下微软:ASP中的会话和状态管理。网络核心

现在我已经尝试使用'MemoryCacheEntryOptions'在内存中存储数据(缓存数据)。问题是它的应用范围太广。而且它很难维持数百个用户。

另一个选项是'Session state'.问题是这些数据只在一个会话中保存。我需要保存数据至少12到24小时。

然后是'Temp Data'。这似乎是一个很有前途的选择。它很好,因为它一直保存到它被使用/读取。你甚至有'Peek'和'Keep'方法来在窥视时保存数据。问题:它需要一个控制器。请求数据是一个回调方法,它不需要控制器。

"查询字符串">嗯,这并不多,不是吗?这可能不是用户关键数据,但似乎查询字符串不是我想要的。

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

HttpContext。项的绝对不合适。数据仅为单个请求存储。

"缓存">难以维护用户特定的数据。

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

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来帮助公开当前的客户。这已经可以很好地与应用程序中已经存在的其他临时功能一起工作,例如管理购物车,愿望清单等,因此浏览其他示例的源代码也会有所帮助。

最新更新