我正在使用Scala / Akka / Play构建市场模拟器。我有一个有两个孩子的Akka演员。孩子们需要具有我想要指定为参数的特定类型。
假设我有以下类定义...
case class SecuritiesMarket[A <: AuctionMechanismLike, C <: ClearingMechanismLike](instrument: Security) extends Actor
with ActorLogging {
val auctionMechanism: ActorRef = context.actorOf(Props[A], "auction-mechanism")
val clearingMechanism: ActorRef = context.actorOf(Props[C], "clearing-mechanism")
def receive: Receive = {
case order: OrderLike => auctionMechanism forward order
case fill: FillLike => clearingMechanism forward fill
}
}
可以按如下方式创建此类的实例...
val stockMarket = SecuritiesMarket[DoubleAuctionMechanism, CCPClearingMechanism](Security("GOOG"))
val derivativesMarket = SecuritiesMarket[BatchAuctionMechanism, BilateralClearingMechanism](Security("SomeDerivative"))
在为特定模型/模拟创建SecuritiesMarket
实例时,我可能会使用拍卖机制类型和清算机制类型的许多可能组合。
我可以在application.conf
文件中指定我希望在给定模拟中使用的类型参数吗?
答案 0 :(得分:2)
我在这里看到两个问题。
Class
实例吗?val cls: Class[DoubleAuctionMechanism] = Class.forName("your.app.DoubleAuctionMechanism").asInstanceOf[Class[DoubleAuctionMechanism]]
您仍需要演员,因为forName
会返回Class[_]
。
好吧,但不是真的。
object SecuritiesMarket {
def apply[A, C](clsAuc: Class[A], clsClr: Class[C])(security: Security): SecuritiesMarket[A, C] = {
SecuritiesMarket[A, C](security)
}
}
我认为拍卖机制和清算机制是SecurityMarket
的依赖关系。我猜你在它的构造函数中以某种方式实例化它们(怎么样?)。如果是这样的话,为什么不直接将它们作为构造函数参数传递?
修改强>
我不知道如何在SecurityMarket中创建子actor
在评论中回答这个问题; Props[T]
也可以写为Props[T](classOfT)
,可以简化为Props(classOfT)
。那三个是一样的。所以下面的代码:
val auctionMechanism: ActorRef = context.actorOf(Props[A], "auction-mechanism")
可替换为:
val classOfA = Class.forName("path.to.A")
val auctionMechanism: ActorRef = context.actorOf(Props(classOfA), "auction-mechanism")
答案 1 :(得分:0)
首先,application.conf是一个运行时工件,据我所知,它的内容通常在编译时没有被解析。在运行时解析文件时,解析器会创建一个Config类的实例,然后控制Akka设置。
Typesafe Config库项目自述文件非常好,链接文档包含所有细节:
https://github.com/typesafehub/config/blob/master/README.md。
其次,由于类型擦除导致模板参数在运行时不可用,因此通常不能使用application.conf来控制模板。您可以创建自定义构建步骤来解析application.conf并在编译之前修改代码,但这可能不是您想要的。 (如果你确实想要一个自定义构建步骤,可能会使用不同的.conf。)
相反,您可以尝试简单地删除证券市场类的类型参数。然后创建一个简单的拍卖实现和清除演员。通过从application.conf中读取相应机制的名称,反射性地实例化配置的机制,并委托给实例化的机制来实现这些actor。机制类可以独立于Akka,如果这是你保留大部分逻辑的地方,这可能很好吗?