组件应该能够验证自己

时间:2014-08-07 14:37:44

标签: architecture domain-driven-design single-responsibility-principle

我现在正面临两难困境。在我的系统中,我从一个复杂的消息中获取了来自各种传感器的大量数据,而不是结构良好的消息。我不能影响它的结构,它也会经常变化,所以作为第一步,我把它翻译成我自己的对象,让它称之为MyMessage。

然后有一个规则,如果我的数据库中存在数据传感器(有效数据),我应该处理数据,如果不存在(无效数据),那么我应该将数据存储到表中并尝试重新处理他们以后。

我的问题如下:如果传感器存在于数据库中,谁应该进行验证。 MyMessage应该决定哪些数据有效,并将它们与无效数据分开提供。

我尝试结合域驱动设计并保持单一责任原则。这意味着如果MyMessage能够自我验证,那么我将打破SRP。但是如果有一些Validator或Splitter,它会分割有效和无效的数据,那么我打破了DDD的基础,因为我添加了一些与域无关的新组件。

3 个答案:

答案 0 :(得分:2)

这里有两个域对象:

IncomingMessage MyMessage

IncomingMessage具有验证自身的功能,也可以从自身生成MyMessage,或者如果它无效,则将自己保存到数据库。

SRP并不意味着一个对象,这里有两个不同的对象。

答案 1 :(得分:1)

所以你要为这条消息制作一个ACL(反腐蚀层)?

在我看来,验证应该在应用服务层完成,因为传感器数据是使用某个传感器存储库检索的,而存储库应该在app服务中使用。

例如

service new_incoming_sensor_message(message_data):
    new_incoming_message = IncomingSensorMessage(message_data)
    # validation part
    try catch:
        sensor = SensorRepository.get(message_data.sensor_id)
    except NoResults:
        invalid_message = InvalidMessage(new_incoming_message)
        InvalidMessageRepository.save(invalid_message)
        return
    # process with message and sensor

您当然可以将验证部分移动到单独的功能或使用策略模式。

答案 2 :(得分:1)

我会通过实施域服务来处理我的域模型(MyMessageValidator或其他东西),并让我的反腐败层选择何时将我的域模型传递给此服务进行验证来解决此问题。然后,ACL可以根据结果选择如何继续。