Scala 如何将行为传递给Akka演员

Scala 如何将行为传递给Akka演员,scala,akka,Scala,Akka,我正在构建Akka应用程序,它将从多个站点检索RSS提要XML。对于每个站点,我将创建一些类,这些类将XML转换为一些通用对象Scala case类,其中包含来自所有RSS提要的公共字段: case class RssFeed(title: String, ...) trait RssTransformer { def getRssFeed(): Seq[RssFeed] } class FooTransformer(...) extends RssTransformer { o

我正在构建Akka应用程序,它将从多个站点检索RSS提要XML。对于每个站点,我将创建一些类,这些类将XML转换为一些通用对象Scala case类,其中包含来自所有RSS提要的公共字段:

case class RssFeed(title: String, ...)

trait RssTransformer {
  def getRssFeed(): Seq[RssFeed]
}

class FooTransformer(...) extends RssTransformer  {
   override def getRssFeed(): : Seq[RssFeed] = {...}
} 

class BarTransformer(...) extends RssTransformer  {
   override def getRssFeed(): : Seq[RssFeed] = {...}
} 
我想创建Akka参与者,并将一些transformer的实现传递给每个参与者,例如一个参与者将使用BarTransformer,另一个参与者将使用FootTransformer等

问题是我使用DI框架Spring来启动actor,所以我不能通过actor的构造函数参数传递转换器。唯一的方法是使用一些消息传递它,但是消息中的传递行为在Akka中是反模式的

你能告诉我如何解决这个问题吗?如果你能给我一些关于如何改进应用程序架构以避免这个问题的建议,那就更好了


谢谢

我不知道你的意思,所以我不能通过actor的构造函数参数传递transformers。使用spring,您可以使用构造函数arg元素来提供


如果问题是必须使用ActorSystemactorOf方法创建Actor,那么一个解决方案是定义自己的ActorSystem和一些道具作为构造函数参数并构造Actor

在决定使用哪种变压器时采用何种逻辑?逻辑是否基于消息类型或负载?@nattyddubbs,否,将不会在运行时确定,而是在编译时确定。例如,我只需要每天在同一时间从不同的站点检索一次数据。因此,我将在编译时手动创建5-6个参与者,并为每个参与者提供transformer的一些实现。我只想概括actor的代码,并将检索和转换数据的封装行为传递给它。也就是说,BarTransformer将向某个站点发出HTTP请求,检索XML,将其转换为Seq[RssFeed]并返回。因此,我的参与者将与rstransformer一起工作,无论实现如何。我想我不太清楚您为什么说使用DI框架。。。所以我不能通过演员的构造函数参数传递变压器。看起来这正是您希望DI框架做的。请看这里: