【发布时间】:2016-12-07 13:30:27
【问题描述】:
我想开发一个框架,用户可以在其中将自己的代码注入我们的平台,而无需了解我们的一些实现细节,这些细节可能会在不久的将来发生变化(例如数据库类型)。
我已将代码分成两个不同的项目:
- 包含公共 API 的一个
- 一个包含服务器端实现
但是,我希望他们可以使用其中一些 API 的一种默认实现来测试他们的代码。
例如,在 公共 API 中:
trait UserDatabase {
def getAllUserInfo : List[UserInfo]
...
}
trait ExecutesOnServer{
def doWhaterverYouWant(db <: UserDatabase ) : Unit
}
在用户代码中:
class ExecutesOnServerImpl{
@override def doWhaterverYouWant(db <: UserDatabase) : Unit {
db.getAllUserInfo.foreach(println)
}
}
现在在私有实施中:
class MySQLUserDatabase extends UserDatabase {
@override def getAllUserInfo : List[UserInfo] = mysql.query(...)
...
}
我希望用户能够访问像LocalTextFileUserDatabase 这样的默认 impl 来测试他们的代码,这被替换为我在服务器上的服务器端。
最好的方法是什么?
感谢您的帮助
【问题讨论】:
-
@Odomontois 感谢您的帮助,我想尽可能避免使用第三方库。我不知道是否有任何设计模式可以解决这个问题。
-
@ogen 是的,使用 Scala,您可以通过实现 cake pattern 在没有任何第三方库的情况下进行 DI
标签: scala design-patterns