如何通过配置文件指定类型参数?

时间:2015-04-27 08:40:35

标签: scala playframework akka

我正在使用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文件中指定我希望在给定模拟中使用的类型参数吗?

2 个答案:

答案 0 :(得分:2)

我在这里看到两个问题。

我可以从字符串中获取Class实例吗?

Yes.

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,如果这是你保留大部分逻辑的地方,这可能很好吗?