2016-01-23 29 views
1

假設我們的Analytics模型訂閱了CommentPosted事件,並且想要將發佈的評論ID記錄到發佈該評論的請求的跟蹤cookie中。不幸的是,我們的CommentPosted事件並不知道HTTP請求的任何內容,因爲它只引用了發佈的評論。DDD:域事件應該如何訪問Web請求數據?

爲了解決這個問題,在我們的聽衆中,我們可以使用DI獲取當前請求並使用它從那裏檢索所需的cookie。但是,這將我們的域緊密耦合到Web層。

另一種方法是要求Controller將需要的cookie傳遞給CommentingService,然後將cookie與cookie調用AnalyticsService。但是現在評論系統必須對分析進行調解。

沒有評論瞭解分析的任何知識並且沒有任何關於Web層的域知識,是否有更好的方式來插入此插件?

+0

爲什麼您的CommentPosted事件中不包含trackerId? – Batavia

+0

因爲評論在其域中沒有跟蹤器的概念。當CommentPosted事件引發時,它只包含發佈的評論。 –

+0

「跟蹤器」概念究竟是什麼?這是一個人,誰提交了評論或其他東西? – Dariss

回答

2

它看起來像我的分析需要的一部分需要您的域的一部分。分析在域名方面爲您做了什麼?

+0

它使用長生存曲奇跟蹤訪問者並記錄其用途以供日後分析。你是說我的評論模型應該有一個trackerId? –

+0

我選擇你的答案是正確的,因爲我最終做到了這一點。但我仍然不完全滿意。 –

1

多個服務可以訂閱一個事件。 analyticsService可以訂閱CommentPostedEvent。這樣你可以避免CommentService依賴於分析服務。那麼分析服務可以找出它需要的東西(比如獲取原始請求)。

你甚至可以做的是定義一個更通用的HttpTrackingEvent,並且在用你想要的cookie完成一個帖子時也會提出這個問題。 (不僅僅是用於評​​論,而是用於具有正確跟蹤ID的任何httppost)然後,AnalyticsService可以訂閱該事件並且(希望)可以確定您正在創建新評論。

2

如果您希望讓您的主域不知道Google Analytics子域,反之亦然,您可以在控制器級別擁有一個捕獲http信息的攔截器/請求處理器以及一個包含有關操作信息的通用Command數據結構用戶在做。然後,攔截器可以直接調用Google Analytics應用程序服務或發佈包含這些詳細信息的事件以用於分析目的。

如果您想跟蹤應用程序中所有命令共享的特徵,而且還需要跟蹤更具體的域級詳細信息,那麼情況開始變得複雜一些。特別是在域操作完成後才知道的那些(例如新發布的CommentId)。

  • 您的評論的應用程序服務的命令後可以返回到控制器完成,它可以傳達給攔截器,但不是與CQRS命令的概念真正標準。

  • 另一種選擇是在分析跟蹤會話和用戶在該會話期間採取的域操作之間建立一些關聯ID。該樞軸可能是命令。 Analytics攔截器持續存在CommandId以及所需的所有http派生信息,並且當域聚合發佈CommentPosted事件時,它可以在事件中包含原始CommandId。如果AnalyticsService訂閱了此事件,它將能夠將其關聯回到該命令所屬的會話(trackerId)。

+0

有趣,謝謝你的答案。將嘗試進一步調查您的建議。 –