首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >配置SORM的最佳实践

配置SORM的最佳实践
EN

Stack Overflow用户
提问于 2013-10-07 23:32:25
回答 1查看 422关注 0票数 2

我想知道是否有人可以分享一些使用SORM的最佳实践,比如在参与者系统中使用和自动化测试(单元/功能)。

你如何:

  • 从运行时构造的外部化配置中驱动DB/实例单例(例如。(打字机的application.conf)
  • 依赖注入(构造函数或蛋糕模式或?)对生产/测试DB使用相同的代码。还是你完全采用了另一种策略?

似乎,当我没有将“实例”声明为单例(对象扩展实例),而是创建一个新的实例,用于注入到我的参与者进行测试时,我会遇到使用SORM的奇怪的堆栈跟踪。我使用scala 2.10.2/3,SORM 0.38/9,结果相同。这是我(唯一的)实体:

代码语言:javascript
复制
object TapJoy {
  private val SECRET_KEY = "aaa"

  case class AddCreditsRequest(tapJoyId: String, verifier: String, currency: Int, snuid: Long) {
    val created = new DateTime()
   <some methods omitted>
  }
} 

堆栈跟踪:

代码语言:javascript
复制
java.lang.ClassCastException: scala.reflect.internal.Types$TypeRef$$anon$3 cannot be cast to scala.reflect.internal.Symbols$Symbol
at scala.reflect.internal.pickling.UnPickler$Scan.readSymbolRef(UnPickler.scala:788)
at scala.reflect.internal.pickling.UnPickler$Scan.readType(UnPickler.scala:355)
at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef$$anonfun$34.apply(UnPickler.scala:855)
at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef$$anonfun$34.apply(UnPickler.scala:855)
at scala.reflect.internal.pickling.UnPickler$Scan.at(UnPickler.scala:171)
at scala.reflect.internal.pickling.UnPickler$Scan$LazyTypeRef.complete(UnPickler.scala:855)
at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1229)
at scala.reflect.internal.Types$TypeRef.thisInfo(Types.scala:2399)
at scala.reflect.internal.Types$TypeRef.baseClasses(Types.scala:2404)
at scala.reflect.internal.Types$Type.findMembers(Types.scala:1093)
at scala.reflect.internal.Types$Type.membersBasedOnFlags(Types.scala:718)
at scala.reflect.internal.Types$Type.members(Types.scala:661)
at scala.reflect.internal.Types$Type.members(Types.scala:343)
at sorm.reflection.ScalaApi$TypeApi.members(ScalaApi.scala:11)
at sorm.reflection.ScalaApi$TypeApi.properties(ScalaApi.scala:13)
at sorm.reflection.Reflection.properties(Reflection.scala:31)
at sorm.core.Initialization$.errors(Initialization.scala:29)
at sorm.Instance$Initialization$$anonfun$2.apply(Instance.scala:212)
at sorm.Instance$Initialization$$anonfun$2.apply(Instance.scala:212)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
at scala.collection.immutable.Set$Set1.foreach(Set.scala:74)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
at sorm.Instance$Initialization.<init>(Instance.scala:212)
at sorm.Instance.<init>(Instance.scala:29)

代码语言:javascript
复制
scala.reflect.internal.Symbols$CyclicReference: illegal cyclic reference involving method productPrefix
at scala.reflect.internal.Symbols$Symbol$$anonfun$info$3.apply(Symbols.scala:1218)
at scala.reflect.internal.Symbols$Symbol$$anonfun$info$3.apply(Symbols.scala:1216)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.reflect.internal.Symbols$Symbol.lock(Symbols.scala:482)
at scala.reflect.internal.Symbols$Symbol.info(Symbols.scala:1216)
at scala.reflect.internal.Symbols$Symbol.tpe(Symbols.scala:1200)
at scala.reflect.internal.Symbols$Symbol.tpeHK(Symbols.scala:1201)
at scala.reflect.internal.Types$Type.computeMemberType(Types.scala:784)
at scala.reflect.internal.Symbols$MethodSymbol.typeAsMemberOf(Symbols.scala:2646)
at scala.reflect.internal.Types$Type.memberType(Types.scala:779)
at scala.reflect.internal.Types$Type.findMembers(Types.scala:1117)
at scala.reflect.internal.Types$Type.membersBasedOnFlags(Types.scala:718)
at scala.reflect.internal.Types$Type.members(Types.scala:661)
at scala.reflect.internal.Types$Type.members(Types.scala:343)
at sorm.reflection.ScalaApi$TypeApi.members(ScalaApi.scala:11)
at sorm.reflection.ScalaApi$TypeApi.properties(ScalaApi.scala:13)
at sorm.reflection.Reflection.properties(Reflection.scala:31)
at sorm.core.Initialization$.errors(Initialization.scala:29)
at sorm.Instance$Initialization$$anonfun$2.apply(Instance.scala:212)
at sorm.Instance$Initialization$$anonfun$2.apply(Instance.scala:212)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
at scala.collection.immutable.Set$Set1.foreach(Set.scala:74)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
at sorm.Instance$Initialization.<init>(Instance.scala:212)
at sorm.Instance.<init>(Instance.scala:29)
EN

回答 1

Stack Overflow用户

发布于 2013-10-08 00:40:31

如何从运行时构造的外部化配置中驱动DB/实例单例(例如。打字机的application.conf)?

相当直截了当。例如:

代码语言:javascript
复制
val db = {
  val config = readAndParseConfigDataSomehow()
  new sorm.Instance( 
    entities = ...,
    url = config.url,
    user = config.url,
    password = config.url,
    poolSize = config.poolSize,
    initMode = config.initMode
  )
}

如何进行依赖注入(构造函数或蛋糕模式或?)对生产/测试DB使用相同的代码。还是你完全采用了另一种策略?

实际上,SORM并没有任何特殊的要求。您可以将实例传递给您,就像任何其他值一样,因此实际使用的实例可以是上下文依赖的:函数或构造函数参数,例如def doSomeStuffWithDB( db : sorm.Instance ){ ... },如果您是它们的粉丝,甚至隐式参数(我知道我不是)。战略的选择真的取决于你。

关于生产和测试环境之间的切换,您已经给出了一个明显的解决方案--配置文件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19236565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档