Scala Cake Pattern

dmike

Bekanntes Mitglied
Ich zerbreche mir gerade den Kopf über das CP in Scala:


Ein Modul M benötigt zwei Service S1 und S2. Wobei S1 und S2 die jeweiligen konkreten Implementierungen von S1trait und S2trait seien.

Definieren tue ich M also so:
Code:
val module = new M with S1 with S2

Wir gehen einfach davon aus, dass M über den self type zu den konkreten Implementierungen gelangt:

Code:
trait M {
    self: S1trait with S2trait =>
}


S1 und S2 sind in meinem Beispiel Restclients. D.h. das Modul M benutzt S1 bzw. S2 um remote Informationen abzuholen.

So wie ich mir S1 und S2 gedacht habe, brauchen beide ihrerseits ein RestEndpointModul R. Dieses Modul kümmert sich um den technischen Ablauf. Es weiß zum Beispiel mit welchem Service (IP Adresse bzw. Hostname) S1 bzw S2 sprechen muss.

Also sieht R so aus:

Code:
sealed trait Rtrait {
  def endpointKey: RestEndpointKey
}

Pro Service gibt es dann verschiedene Implementierungen von Rtrait:

Code:
trait R1 extends Rtrait {
  val endpointKey = ProductServiceEndpointKey
}

trait R2 extends Rtrait {
  val endpointKey = PaymentServiceEndpointKey
}


Jetzt kommt es zum eigentlichen "Dilemma":

Ich möchte S1 mit R1 konfigurieren, und S2 mit R2. Also ähnlich wie im Fall M

Code:
trait S1trait {
  self: Rtrait =>
}

Nur geht das so natürlich nicht
Code:
val module = new M with S1 with S2 with R1 with R2


Denn zur Compilezeit sind beim Wiren von Modul M zwei alternative Impls von Rtrait vorhanden (R1 und R2)**

Was ich eigentlich habe will (pseudo code)

Code:
val module = new M with (S1 with R1)  with (S2 with R2)

D.h. die Impl R1 und R2 soll bitteschön nur im Scope von S1 bzw. S2 zu sehen sein.

Nur wie bekomme ich das mit dem CP hin?


**

play.sbt.PlayExceptions$CompilationException: M inherits conflicting members:
value endpointKey in trait R1 of type R1.type and
value endpointKey in trait R2 of type R2.type
 

Neue Themen


Oben