2017-04-13 40 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