2014-11-23 66 views
0

我不知道是否有可能綁定語法如下依賴關係:DI綁定到一個子類

bind [Environment[User, Authenticator]] to FakeEnvironment[User, SessionAuthenticator](testUser) 

(這是從測試採取實際的模塊結合是稍微詳細)

其中SessionAuthenticator具有以下特徵:

case class SessionAuthenticator(val loginInfo : com.mohiva.play.silhouette.api.LoginInfo, ...) 
    extends scala.AnyRef 
     with com.mohiva.play.silhouette.api.Authenticator 
     with scala.Product 
     with scala.Serializable {...} 

Authenticator

trait Authenticator extends scala.AnyRef {...} 

但我得到的是在編譯過程中以下堆棧跟蹤:

[error] /home/mironor/projects/livrarium/test/controllers/CloudSpec.scala:22: overloaded method value to with alternatives: 
[error] [T <: com.mohiva.play.silhouette.api.Environment[services.User,com.mohiva.play.silhouette.api.Authenticator]](fn: => T)(implicit evidence$2: reflect.runtime.universe.TypeTag[T])scaldi.BoundHelper[T] <and> 
[error] (none: None.type)scaldi.BoundHelper[com.mohiva.play.silhouette.api.Environment[services.User,com.mohiva.play.silhouette.api.Authenticator]] 
[error] cannot be applied to (com.mohiva.play.silhouette.test.FakeEnvironment[services.User,com.mohiva.play.silhouette.impl.authenticators.SessionAuthenticator]) 
[error]  bind [Environment[User, Authenticator]] to FakeEnvironment[User, SessionAuthenticator](user) 

這樣我可以選擇只有一次在應用程序了的Module使用並注入它像這裏面Authenticator

implicit val env = inject[Environment[User, Authenticator]] 

而不是:

implicit val env = inject[Environment[User, SessionAuthenticator]] 

我有什麼選擇?

回答

1

可以使用scaldi將其歸檔,但問題在於定義和使用Environment的方式。我認爲(至少有錯誤告訴我這個)Environment對於它的兩個類型參數都是不變的。這是個問題,因爲你想把Environment[User, Authenticator]當作Environment[User, SessionAuthenticator]的超類。如果兩個類型參數都定義爲不變,則不是這種情況。要解決這個問題,你可以只讓Environment協的第二個類型參數與+

trait Environment[A, +B] 

理論上它應該解決您顯示的編譯錯誤。

+0

謝謝,這解釋了這個問題,特質被定義爲特質環境[I <:Identity,T <:Authenticator] – Mironor 2014-11-28 07:53:52