Scala中具有类型类的DAO

| 让我的应用程序包含业务类
Order
Product
Customer
等,我想将其存储在数据库中或从数据库中检索。 通常,我们为此使用
DAO
模式。也就是说,我们为每个业务类定义一个
DAO
接口和实现:
OrderDAO
ProductDAO
等。现在,我想使用类型类模式:
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 = {...}
如何用类型类实现implement8ѭ?     
已邀请:
我不认为类型课是解决问题的方法。类型类用于描述功能,而不是代替DI。 例如,如果您的DAO写入键值存储,则可能需要将类转换为键和值的映射的功能。 在这种情况下,类型类为:
trait KeyValuable[T] {
  def toMap(t: T): Map[String, String]
}
很明显,无论环境如何,您都可以为每个业务类别提供正确的实现。它是这种类型的继承功能,与随后的使用方式无关。     
如何创建一个包含所有DAO并使用DataSource对其进行初始化的对象?额外的间接访问,但这会起作用。 我还不知道在Scala中处理依赖注入的最佳实践,但这也可能对您有用:http://www.assembla.com/wiki/show/liftweb/Dependency_Injection     
同意萨沙。举升方式应该起作用:
trait DataSource

class MyDataSource extends DataSource

object DataSources {
  @volatile var dataSource: () => DataSource = () => new MyDataSource
}
通过这种方法,您可以使用ѭ19,而不会降低可测试性。     

要回复问题请先登录注册