域事件如何通知ui价格已更改?

时间:2019-06-16 13:34:08

标签: domain-driven-design

我有项目:

  • ui
  • 应用程序
  • 基础设施

在ui项目中,会话中有一个购物车:

public class Cart
{
    public List<CartItem> CartItems { get; set; } = new List<CartItem>();
}

public class CartItem
{
    public Guid ItemId { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }
}

在域项目中,我引发了事件 ProductPriceHasChangedEvent 。在应用程序项目中,我具有事件处理程序: ProductPriceHasChangedEventHandler -如何在用户会话中刷新购物车中的产品价格?项目应用程序没有对项目ui的引用,也没有对httpcontext和session的引用。

2 个答案:

答案 0 :(得分:1)

您的UI(具有有效打开会话的用户购物车)必须在您的应用程序中查询购物车商品的最新价格。

我认为最好的方法是定期重新加载购物车,执行初始加载所做的所有逻辑。然后,您会刷新购物车中的所有信息,不仅是价格,即描述,商品可用性(如果需要)等。

假设我们正在谈论单页JS应用+ Web API:

使您的购物车的JavaScript可以查询API,以便每隔一小时(取决于您的时间)重新加载购物车:

GET /api/users/<userid>/cart

然后从传入的数据刷新UI。这样一来,您可以随时了解最新价格。

答案 1 :(得分:1)

您的问题已超出DDD的权限。 DDD不会直接处理UI与域之间的通信,也不会基于该域提出建议。实际上,DDD在与UI无关的方面非常清楚。不过,要解决您的问题,请执行以下操作:更新UI的主要方法有两种:

  1. 拉(轮询)-就像@ Alex-Buyny所描述的那样,您将定期调用服务器以获取最新信息并根据结果更新UI。最简单的方法是通过单页应用程序和REST API后端。当然,您也可以间隔一定时间重新加载。
  2. 服务器推送-有可用更新时,服务器推送到您的UI。这种方法依赖于websocket,并且比轮询复杂得多。使用资源也更加有效,通常需要更强大的解决方案。