2011-06-07 36 views
10

我试图创建一个使用吉斯吉斯和Scala - 仿制药的依赖注入

通用的特质

如何看trait定义的结合

trait Repository[T] 

trait实施

class DomainRepository extends Repository[Domain] 

我的配置方法DomainPersistenceModule是:

def configure() { 
    bind(classOf[Repository[Domain]]) 
    .annotatedWith(classOf[DomainDependency]) 
    .to(classOf[DomainRepository]) 
    .in(Scopes.SINGLETON) 
} 

的变量,其关系将被注入的是:

@Inject 
    @DomainDependency 
    var repository:Repository[Domain] = _ 

注入发生在这里:

val injector:Injector = Guice.createInjector(new PersistenceModule()) 

val persistenceService:PersistenceService = 
     injector.getInstance(classOf[DomainPersistenceService]) 

的错误是:

Caused by: com.google.inject.ConfigurationException: Guice configuration errors: 

1) No implementation for repository.Repository<domain.Domain> annotated with @module.annotation.DomainDependency() was bound. 
    while locating repository.Repository<domain.Domain> annotated with @module.annotation.DomainDependency() 
    for field at service.persistence.DomainPersistenceService.repository(DomainPersistenceService.scala:19) 
    while locating service.persistence.DomainPersistenceService 

我缺少的东西? 在此先感谢

回答

15

你需要一个TypeLiteral结合这样的:“?如何使用泛型类型注入类”

bind(new TypeLiteral[Repository[Domain]] {}) 
.annotatedWith(classOf[DomainDependency]) 
.to(classOf[DomainRepository]) 
.in(Scopes.SINGLETON) 

见在Guice FAQ

11

正如David所说,你需要一个TypeLiteral来绑定一个泛型类型(记住 - 泛型类型被删除到只有类,没有运行时类型参数)。

另一种选择是类似于我的Scala Guice库来构建从斯卡拉的Manifest s的Guice所需的TypeLiteral。如果你混入ScalaModule的特质,那么你就可以做类似的事情:

bind[Repository[Domain]] 
.annotatedWith[DomainDependency] 
.to[DomainRepository] 
.in(Scopes.SINGLETON)