Использование Reader Monad для внедрения зависимостей

Недавно я видел доклады Dead -Simple Dependency Injection и Dependency Injection Without the Gymnastics о DI с монадами и был впечатлен. Я пытался применить его к простой задаче, но потерпел неудачу, как только это стало -нетривиальным. Я действительно хотел бы увидеть работающую версию внедрения зависимостей, где

  • класс, который зависит от более чем одного значения, которое необходимо внедрить
  • класс, который зависит от класса, который зависит от чего-то, что нужно внедрить

как в следующем примере

trait FlyBehaviour { def fly() }
trait QuackBehaviour { def quack() }
trait Animal { def makeSound() }

// needs two behaviours injected
class Duck(val flyBehaviour: FlyBehaviour, val quackBehaviour: QuackBehaviour) extends Animal 
{
   def quack() = quackBehaviour.quack()
   def fly() = flyBehaviour.fly()
   def makeSound() = quack()
}

// needs an Animal injected (e.g. a Duck)
class Zoo(val animal: Animal)

// Spring for example would be able to provide a Zoo instance
// assuming a Zoo in configured to get a Duck injected and
// a Duck is configured to get impl. of FlyBehaviour and QuackBehaviour injected
val zoo: Zoo = InjectionFramework.get("Zoo")
zoo.animal.makeSound()

Было бы очень полезно увидеть пример реализации с использованием монады для чтения, поскольку я просто чувствую, что мне не хватает толчка в правильном направлении.

Спасибо!

24
задан Manuel Schmidt 30 June 2012 в 17:52
поделиться