2017-04-13 39 views
0

的字符串解析器coresponds到特定域應當被認爲是一個實用程序或結構域/值對象?設計特定特徵在DDD

實施例:用戶提交的金融工具的搜索請求。例如「OMX KR股票」。爲了將這種字符串提交給提供者,必須對其進行解析並將其映射到其確切值(工具名稱,市場代碼,工具類型)。搜索請求文件結構取決於儀器類型,因此在解析字符串後,必須根據數據庫中的現有類型檢查儀器類型。如果不存在,則不能提交搜索請求,並且用戶必須相應地收到響應。

(與您預期的有點不同,用戶提交搜索請求,應用程序通過生成請求文件通過FTP向外部提供者提交搜索請求,經過一段時間請求得到滿足並從並且保存到數據庫中,所以沒有立即迴應搜索請求。)

我無法找到合適的位置來放置此邏輯。通常它可能是SearchRequest實體內的值對象,但是需要根據數據庫進行驗證會引發問題。

而且我試圖避免引入靜態的解決方案,因爲我懷疑它使測試更加困難。尤其是如果它被認爲是域的邏輯,我不認爲它應該屬於一個靜態方法作爲一種實用工具,輔助性或者等

什麼會根據DDD解決這個問題的正確方式?

+0

搜索通常不會修改域模型,那麼爲什麼您需要驗證儀器類型? 「驗證」是一種奇怪的方式來拼寫「如果不支持此工具,請執行其他操作」。 – VoiceOfUnreason

+0

用更多的信息更新了這個問題 – DasBoot

+0

搜索查詢格式是所有搜索提供者的一個約束(假設會有更多的)或者它是特定於當前提供者的嗎?我可能有一個接口,比如'ISearchProvider {List validateQuery(String searchQuery),...}'並在基礎結構中實現它。可以在域或應用程序服務層中定義「ISearchProvider」和「SearchQueryError」(不確定哪裏最好)。 – plalx

回答

1

與特定域相關的字符串解析器應該是 被視爲實用程序或域/值對象?

這應該是一個Value object,將驗證在構造函數的格式(例如,使用正則表達式:[A-Z]{3}\s[A-Z]{2}\s[a-zA-Z]{1,}),這將只有三個此字符串的三個部分干將:getName():stringgetType():stringgetCode():string。讓我們給這個類命名:InstrumentQuery。它有only one responsability:驗證+解析字符串。

搜索請求文件結構取決於儀器類型,所以 字符串被解析後的儀器類型有針對數據庫 現有類型進行檢查。

「檢查針對數據庫中現有的各類」被接收的搜索指令,調度命令的SearchRequest aggregateApplication service完成。雖然在大多數在整個世界現有站點的搜索是某種形式的query method,在你的域SearchRequestAggregate。該總計有一個submitQuery(InstrumentQuery instrumentQuery)command method

根據您的設計,InstrumentTypeEntity(所以它有一個ID)或Value object。如果它是Entity那麼submitQuery可能會收到它的ID;這取決於內部使用情況。無論如何,在命令通過嘗試從Repository加載命令到達SearchRequestAggregate之前檢查其存在。

尤其是如果它被認爲是域的邏輯,我不認爲它應該 屬於或靜態方法作爲一種實用工具,幫助等

正如你所看到的,你有兩種不同的驗證:

  1. SearchRequest的格式:純域邏輯,保持內部ValueObject,域代碼層的內部。
  2. 存在一個InstrumentType:應用層邏輯,通過嘗試從存儲庫加載來檢查。
+0

我喜歡這個大概的想法,但是我有一個關於SearchQuery值對象的問題。我注意到異常被用作一種防止在構造函數中專門創建錯誤的狀態域對象(例如檢查空值)的方法。但我從來沒有見過這些例外。如果你必須這樣做,它看起來不是一個好方法。說這些例外是開發者公共API的一部分,是否正確?我想替代方法是在值對象中引入一個屬性IsValid並在繼續之前檢查它。 – DasBoot

+0

@DasBoot我非常喜歡拋出異常,以便在無效數據的情況下放棄「快樂路徑」,因爲它們使「快樂路徑」更加清晰。是的,公共API應該包含/記錄這些例外情況作爲一等公民。另一種方法'isValid'不是最優的,因爲它在用法/ getters和isValid之間創建了一個時間耦合:在使用該對象之前,一個**必須記住**來調用isValid。 –

+0

這是否意味着您通常會用try catch子句包裝對象實例或者您只是在最頂層捕獲特定的域例外?就我個人而言,我不會使用異常來處理業務驗證案例。欣賞你的答案。 – DasBoot