Scala中的DAO类型类

时间:2011-04-12 14:37:41

标签: scala dao implicit

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

通常,我们会将DAO模式用于此目的。也就是说,我们为每个业务类定义DAO接口和实现:OrderDAOProductDAO等。现在我想使用类型类模式:

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

3 个答案:

答案 0 :(得分:2)

我不认为类型类是这里的方式。类型类用于描述功能,而不是替代DI。

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

在这种情况下,类型类是:

trait KeyValuable[T] {
  def toMap(t: T): Map[String, String]
}

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

答案 1 :(得分:1)

如何创建一个包含所有DAO的对象并使用您的DataSource初始化它们?额外的间接但这可行。

我不知道(还)处理Scala中的依赖注入的最佳实践,但这也适用于您:http://www.assembla.com/wiki/show/liftweb/Dependency_Injection

答案 2 :(得分:1)

同意Sasha。提升方式应该有效:

trait DataSource

class MyDataSource extends DataSource

object DataSources {
  @volatile var dataSource: () => DataSource = () => new MyDataSource
}

使用这种方法,您可以使用object而不会失去可测试性。