Architecture 组件应该能够自我验证吗

Architecture 组件应该能够自我验证吗,architecture,domain-driven-design,single-responsibility-principle,Architecture,Domain Driven Design,Single Responsibility Principle,我现在正挣扎于一个两难境地。在我的系统中,我从不同的传感器获取了大量数据,这些数据包含在一条复杂的信息中,而不是结构良好的信息中。我不能影响它的结构,它也经常变化,所以作为第一步,我把它翻译成我自己的对象,我们称之为MyMessage 然后有一条规则,如果我的数据库中存在数据传感器(有效数据),我应该处理数据,如果不存在(无效数据),那么我应该将数据存储到表中,并在以后尝试重新处理它们 我的问题如下:如果数据库中存在传感器,谁应该进行验证。MyMessage是否应确定哪些数据是有效的,并将其与无

我现在正挣扎于一个两难境地。在我的系统中,我从不同的传感器获取了大量数据,这些数据包含在一条复杂的信息中,而不是结构良好的信息中。我不能影响它的结构,它也经常变化,所以作为第一步,我把它翻译成我自己的对象,我们称之为MyMessage

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

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


我尝试将领域驱动设计与单一责任原则相结合。这意味着如果MyMessage能够自我验证,那么我将破坏SRP。但是,如果有一些验证器或拆分器可以拆分有效数据和无效数据,那么我就破坏了DDD的基本原理,因为我添加了一些与域无关的新组件。

这里有两个域对象:

收入信息 我的消息

IncomingMessage具有验证自身的功能,还可以从自身生成MyMessage,或者在无效时将自身保存到数据库中


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

这里有两个域对象:

收入信息 我的消息

IncomingMessage具有验证自身的功能,还可以从自身生成MyMessage,或者在无效时将自身保存到数据库中

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

那么您是在为此消息创建ACL(防腐蚀层)

在我看来,验证应该在应用程序服务层进行,因为传感器数据是使用一些传感器存储库检索的,存储库应该在应用程序服务中使用

例如:

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
当然,您可以将验证部分移动到单独的功能或使用策略模式。

那么您正在为此消息创建ACL(反破坏层)

在我看来,验证应该在应用程序服务层进行,因为传感器数据是使用一些传感器存储库检索的,存储库应该在应用程序服务中使用

例如:

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

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

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

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

MyMessage真的是域对象吗?因为它与域无关,所以它以我需要的方式提供对IncomingMessage元素的访问。@Michal MyMessage是此特定上下文的域对象MyMessage真的是域对象吗?因为它与域无关,所以它的存在是为了以我需要的方式提供对IncomingMessage元素的访问。@Michal MyMessage是此特定上下文的域对象