Scala中带有类型类的DAO



让我的应用程序包含业务类Order, Product, Customer等,我想在数据库中存储/检索它们。

通常,我们为此目的使用DAO模式。也就是说,我们为每个业务类(OrderDAOProductDAO等)定义了DAO接口和实现。现在我想使用类型类模式:
trait DAO[T] {
  def create(t:T)
  ... // other CRUD operations
}
...
// DAO implementations for specific business objects
implicit object OrderDAO extends DAO[Order] {
   def create(o:Order) {...}
   ... // other CRUD operations
}
...
// create a business object in the database
def create[T](t:T)(implicit dao:DAO[T]) {dao.create(t)}

现在我的问题是,所有DAOs使用DataSource实例(数据库连接的工厂),所以我不能将DAOs定义为objects。我应该创建一个DataSource的单例实例,并在初始化时将其传递给所有DAOs

假设我们有一个创建DataSource的函数:

def dataSource():DataSource = {...}
如何使用类型的类实现DAOs ?

我不认为type class是这里的方法。类型类用于描述功能,而不是作为DI的替代品。

例如,如果DAO写入键值存储,则可能需要将类转换为键和值的Map的能力。

在这种情况下,类型类是:
trait KeyValuable[T] {
  def toMap(t: T): Map[String, String]
}

很明显,无论环境如何,您都可以为每个业务类提供正确的实现。它是类型的继承能力,与您如何使用它无关。

创建一个对象来保存所有dao并使用DataSource初始化它们怎么样?额外的间接作用,但这是可行的。

我不知道在Scala中处理依赖注入的最佳实践,但这可能对你也有用:http://www.assembla.com/wiki/show/liftweb/Dependency_Injection

同意Sasha的观点。升降方式应工作:

trait DataSource
class MyDataSource extends DataSource
object DataSources {
  @volatile var dataSource: () => DataSource = () => new MyDataSource
}
使用这种方法,您可以在不失去可测试性的情况下使用object

相关内容

最新更新