我喜欢他们设计/构建它的方式,但我该如何实现它

时间:2010-04-17 00:18:43

标签: architecture

要点:

我在主页上有不同的组件,每个组件都向用户显示一些促销。

我将购物车作为一个组件,并根据购物车促销的内容显示。 我必须跟踪用户在线活动并将该信息发送到Omniture报告生成。

现在我的组件异步加载基本上是在AjaxRequest启动时加载的,所以没有修复模式或者更确切地说有关组件何时出现在网页上的信息。现在,为了将信息传递给Omniture,我需要在$(document).(ready)上调用跟踪功能,并为每个组件附加信息(Omniture为每个组件都需要7个参数)。

所以在每个组件的init:config函数中调用Omniture并传递参数但现在 no. of Omniture calls is directly proportional to no. of Components on the webpage 但这是不可接受的,因为每次调用Omniture都非常 昂贵 即可。

现在我正在寻找一种方法,我可以在其中提供有关7个参数的信息,而不是向Omniture拨打一个电话,其中我传递了这些信息。

需要注意的是,我不知道何时加载组件,因此没有预定义的时间或没有。要加载的组件

当文件准备就绪时,我正在调用跟踪功能,但是在调用Omniture之后加载了组件,所以我的问题是

问:我如何收集所有组件的信息,而不只是打电话给Omniture发送这些信息?

如上所述,我不知道何时加载组件,因为它们是在Ajax请求上完成的。

希望我能够解释我的挑战,如果有人可以提供 设计/架构师 挑战解决方案,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

不要直接去Omniture;去找一个获取数据的“中间人”。

我从来没有听说过Omniture,但听起来就像是你的用户界面直接进入数据层的情况 - 在这种情况下,你需要一个业务逻辑层。无论如何,这就是原则。

  1. 创建一个处理UI和Omniture之间所有通信的逻辑层。
  2. 第一个UI调用命中逻辑层/控制器,例如:Logic.GetPromotion()
  3. 如果发生这种情况,请使用逻辑调用omniture - 让它进行一次获取所有数据的批量调用,就像你所说的那样。
  4. 将请求的数据(Logic.GetPromotion())传递给任何调用它的人。
  5. 当另一个调用逻辑层时,它会从刚刚收到的信息中提取数据 - 而不是从omniture中提取。
  6. 基本上它是Lazy-Load模式;各种各样的问题分开 - 我不确定我是否称之为MVC - 只是结构合理(?)。

    这种方法的一个潜在问题是你的调用是异步的 - 逻辑控制器可能会在第二次调用时等待结果从第一次调用返回。我自己没有做过这些工作,但是有很多多线程/并发类型design patterns可以提供帮助。

答案 1 :(得分:0)

我假设所有组件在页面加载时调用AJAX并异步加载。

考虑加载N个组件。因此,将向服务器发出N个AJAX调用。

使用当前实现,在成功加载每个组件后,调用Omniture。

大多数浏览器允许最多2-5个活动连接到服务器。因此,上述N个呼叫将一次执行2-5个并发呼叫,并且在完成此呼叫时不会保证订单。

我们需要有一个机制来拦截AJAX调用以加载组件,这样我们就可以维护正在进行的这些调用的列表以及已完成的调用列表。

一旦正在进行的调用列表的计数为零,所有组件都已加载,并且我们在已完成的AJAX调用列表中有每个已加载组件的信息。

使用每个已加载组件的信息列表,如果它具有所需的API,则对Omniture进行一次调用。如果Omniture没有用于批量调用的API,则在服务器上调用中间外观,它将迭代地调用Omniture。

Have an API that will be used by components to make AJAX calls
Each time AJAX request is made for a component to load [new Ajax.Request(...)], 
    API adds component request info entry to requestInProgressList
Each time AJAX request is for a component is complete (function onComplete(...) callback), 
    API moves component request info entry from requestInProgressList to requestCompleteList
    IF requestInProgressList.count == 0 // No more pending requests
    THEN
        From requestCompleteList, collect the information for all the components into variable dataOmniture
        Clear requestCompleteList
        Make a call to Omniture to send dataOmniture information
    END