Использование DI в приложениях, написанных на Scala и Java - возможно ли это «способом Scala» - без дополнительных рамок? - PullRequest
0 голосов
/ 14 января 2011

У меня есть приложение, написанное частично на Java и Scala.В случае кода Scala я хочу использовать функции scala для внедрения зависимостей.В старом Java-коде пружина использовалась, т. Е. Для внедрения сервисных бинов в страницы калитки и т. Д. В коде Scala я использую шаблон самоотверженной черты для создания сервисов, как описано здесь: http://www.artima.com/scalazine/articles/selfless_trait_pattern.html

Внедрение зависимостей в Scala в настоящее время выполняется с использованиемКонфигурационный объект, который соединяет все воедино:

scala> trait Friendly {
     |   def greet() { println("hi there") }
     | }
defined trait Friendly

scala> object Friendly extends Friendly
defined module Friendly

scala> object ServiceConsumer {
     |  def myService: Friendly = myServiceInjected.getOrElse(throw new RuntimeException("dependency not injected"))
     |  var myServiceInjected: Option[Friendly] = None
     | }
defined module ServiceConsumer

scala> class ServiceConsumer {
     |  def callService() {
     |    ServiceConsumer.myService.greet()
     |  }
     | }
defined class ServiceConsumer

scala> object Configuration { 
     |  def init() {
     |   ServiceConsumer.myServiceInjected = Some(Friendly)
     |  }
     | }
defined module Configuration

scala> Configuration.init

scala> val c = new ServiceConsumer
c: ServiceConsumer = ServiceConsumer@292e2fba

scala> c.callService()
hi there

Но как использовать услугу "Friendly" из класса Java?Должен ли я использовать Spring?Как опубликовать дружественный сервис, написанный на Scala, как Spring bean?

Ответы [ 4 ]

1 голос
/ 14 января 2011

Я не уверен, что это именно то, что вы ищете, но я расскажу вам о практике, которая работает для меня.

Мой Java-код подключен вместе с помощью DI-инфраструктуры Google под названием Guice , API, для которого я вызываю из своего кода Scala. В качестве примера, вот модуль - это вещь конфигурации Guice - который связывает интерфейсы с их реализациями. API - это Java API, но я взаимодействую с ним из кода Scala.

class UserSessionModule(storage: ActorRef) extends AbstractModule {
  protected def configure: Unit = {
    bind(classOf[ActorRef]).
      annotatedWith(Names.named("storage")).toInstance(storage)
    bind(classOf[UserSession]).toProvider(classOf[UserSessionProvider])
  }
}

Я нашел, что это очень простой подход.

1 голос
/ 14 января 2011

Я бы создал фабричный метод в Scala:

class MyService { def doSomething = ... }
object MyService {
  def create: MyService = ...
}

Затем используйте его из Java в качестве статического метода:

import com.mycompany.myproject.MyService
MyService svc = MyService.create
svc.doSomething
1 голос
/ 14 января 2011

Я думаю, что модель торта достаточно хороша для Scala DI.Моя любимая статья об этом:

Реальная Scala: инъекция зависимостей (DI) - Джонас Бонер

0 голосов
/ 18 мая 2011

Я использую Spring DI абсолютно без проблем с Scala.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd">

  <context:component-scan base-package="com.mypackage"/>

</beans>

И затем я указываю нужные компоненты:

@Service
class MyService

, а затем получить к нему доступ через:

class OtherClass {
    @Autowired
    var myService:MyService = _
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...