我想将过滤谓词发送给持久化演员,这可能有什么问题?

I want to send filtering predicate to persistent actor, what may be wrong with this?

我有一个坚持不懈的演员,他持有一些价值观。我需要得到一些经过过滤的。所以,我有两个办法:

1) 创建新消息说

GetValuesWithNameAndAgeGraterThan(name: String, age: Int)

pro: 不变的,正统的:) 相反:这里的问题是逻辑泄漏到只负责保存和提供数据的持久性参与者中,你,这种情况完全适合提供数据定义。但它为什么要知道它保留的 "name" 和 "age" 价值呢?! 从明天开始,我将需要添加越来越多的消息,最后会变得一团糟。

2) 使用过滤谓词创建通用消息

Filter(p: Value => Boolean)

pro:单一、可扩展、正确使用时不可变 相反:我看到有人这样做时唯一的问题

val ages: mutable.Seq[Int]
persistor ? Filter(v => ages.contains(v.age))
ages += 18
ages += 33

但我们通常在 Scala 中使用不可变值! 而且尝试持久化 lambda 也是不自然的,但我们将它用于只读!

那么,你怎么看?!

永远不要遵循第二种方法! 第一个是有效的,但 id 稍微改变了这一点。 您最初可以就存储数据的某些合同达成一致,例如,可能是一个枚举,其中每个值都带有一个值类型。 所以你用

修改你的消息

GetValueForCondition(conditions: Seq[DataType, filter: Value => Boolean]),其中 DataType 是一个枚举值,指定数据的名称和类型,过滤器定义值的条件。 通过这种方式,您可以为实体指定通用查询,该查询可重复用于对其他数据存储参与者的请求。您还可以包括一个布尔值,指示每个数据字段是否必须为要在结果中返回的实体设置它。如果您将属于一个实体的所有这些信息(例如姓名、年龄等)存储在一个实体对象中(例如您的持久性 actor 有一些存储多个这样的实体),您可以在该实体 class,你的数据提供者没有这个逻辑。