我想将过滤谓词发送给持久性参与者,这可能有什么问题?

时间:2019-04-09 10:39:53

标签: scala filter akka akka-persistence

我有一个坚持不懈的演员,拥有一些价值观。我需要过滤掉其中一些。因此,我有两种方法:

1)创建新消息说

GetValuesWithNameAndAgeGraterThan(name: String, age: Int)

pro:不可变,正统:) 相反:这里的问题是逻辑泄漏到持久性参与者中,后者仅应负责保存和提供数据,而这种情况恰好适合提供数据定义。但是,为什么要知道它保持的价值的“名称”和“年龄”呢? 从明天开始,我将需要添加越来越多的消息,这些消息最终将变得一团糟。

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

Filter(p: Value => Boolean)

pro:单个,可伸缩,正确使用后不变 对比:我看到有人做的唯一问题

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

但是我们通常在Scala中使用不可变的值! 尝试保留lambda也是不自然的,但是我们将其用于只读!

那么,你怎么看?!

1 个答案:

答案 0 :(得分:1)

永远不要遵循第二种方法! 第一个有效,但id可以对此稍作更改。 您最初可能会就存储数据达成某种合同,例如可能是一个枚举,其中每个值都带有值类型。 因此,您可以使用

修改邮件

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