2016-09-07 4 views
0

У меня довольно простой сценарий для решения с помощью DI, но я не могу найти подходящий пример/документацию, чтобы получить меня. Я новичок в мире Scala/Guice.Инъекция зависимостей в Scala Guice - Параметры прохождения

текущие компоненты выглядеть следующим образом

trait Foo { 
} 

class FooImpl extends A { 

} 

trait Bar { 
    val description: String 
} 

class BarImpl(val description: String) extends Bar { 

} 

Теперь у меня есть зависимость между Foo и Bar. Таким образом, как правило, код будет выглядеть следующим образом

class FooImpl extends Foo { 
    Bar bar = createBar("Random Bar Value!") 
} 

где createBar("Bar!") просто возвращает new BarImpl("Random Bar Value"). Конечно, я удаляю фабрику/помощник для краткости.

Я понимаю, момент, когда я использую «новое», это вне парадигмы DI. Я хочу убедиться, что Bar может быть введен в FooImpl на основе параметра. Похоже на использование фабрики. Как мы используем DI в мире Scala/Guice.

Я посмотрел на AssistedInjection/Named Parameters, но я не мог понять, как это будет выглядеть. Я предполагаю, что это лучший способ пойти, но не мог понять, как это должно быть написано/протестировано.

ответ

0

Хорошо, так это то, что сработало для меня, наконец. Переписывая эти шаги для тех, кто хочет иметь дело с Scala Based Assisted Injection.

Foo может потребовать Bar, но то, что действительно нужно вводить, является BarFactory, а не Bar.

Необходимо создать BarFactory, но реализация может быть предоставлена ​​Guice. Вот где это становится сложно.

trait BarFactory { 
    def create(msg:String):Bar 
} 

Итак, давайте вернемся Foo и Bar:

@ImplementedBy(classOf[FooImpl]) 
trait Foo { 
    def getBar(msg: String): Bar 
} 

class FooImpl @Inject() (barFactory: BarFactory) extends Foo { 
    override def getBar(msg: String): Bar = { 
    barFactory.create(msg) 
    } 
} 

@ImplementedBy(classOf[BarImpl]) 
trait Bar { 
    def echo() : String 
} 

//Note that we use the @Assisted Annotation Here. 
class BarImpl @Inject() (@Assisted msg: String) extends Bar { 
    override def echo(): String = msg 
} 

Создание фактического завода осуществляется в рамках модуля

class TempModule extends AbstractModule { 
    override def configure(): Unit = { 
    install(new FactoryModuleBuilder() 
     .implement(classOf[Bar], classOf[BarImpl]) 
     .build(classOf[BarFactory])) 
    } 
} 

И когда началось, Фабрика реализации будет обеспечиваться Guice, и вы должны иметь возможность создать свою фактическую реализацию с помощью Factory.