Как добавить play.api.db.slick.Config.driver.simple.Session в изящный компонент DAO

Я использую шаблон торт для введения зависимостей между компонентами в приложении Play 2.2.1. Приложение состоит из игровых контроллеров, и мы используем пользовательские ActionBuilder открыть нашу сессию БД. В настоящее время мы пропускаем этот сеанс БД до уровня нашей модели через уровни контроллера и DAO в качестве неявного аргумента. (ActionBuilder -> Controller -> DAO -> Slick Model)

Я использую Play-Slick для гладкой интеграции и пытаюсь использовать подход DAO для инкапсуляции доступа к нашим моделям Slick. Наши DAO имеют несколько определений функций, таких как findById(id: Int)(implicit s: Session): Option[Entity], Я хотел бы избежать этого неявного параметра сеанса в каждом определении функции путем внедрения компонента получения DBSession. Этот компонент будет вызываться внутри функциональных блоков DAO каждый раз для получения текущего сеанса БД запроса.

Исходя из мира Java и Spring, я не знаю точно, как этого добиться, учитывая, что я, вероятно, не могу полагаться на какой-либо прокси-сервер с областью действия ThreadLocal.

Есть идеи, как мне этого добиться? Это хорошая или плохая идея?

2 ответа

Вы можете поместить все ваши методы в класс, который принимает неявный сеанс в качестве аргумента, а затем вы всегда сначала создаете экземпляр класса, а затем вызываете метод. Пример здесь: http://slick.typesafe.com/doc/2.0.2/connection.html

Если вы можете извлечь сеанс БД как функцию запроса, вы можете предоставить неявное преобразование для преобразования Request => DBSession.

Как это:

implicit def request2DBSession(request: Request[T]): DBSession = ???

Внутри которого вы можете выполнять поиск DBSession.

РЕДАКТИРОВАТЬ:

Более того, вы можете использовать композицию действий для внедрения сеанса с каждым запросом:

trait BaseController extends Controller {
  def DBAction(f: (request[_]) => DBSession => Result) = {
    Action { request =>
      val dbSession = ??? // Lookup DBSession
      f(request)(dbSession)
    }
  }  
}

object Controller extends BaseController {
  def lookupUser = DBAction { implicit request => implicit dbSession =>
    ??? // DBSession in Implicit Scope (free to use slick calls)
  }
}

Это было бы немного чище, на мой взгляд.

Другие вопросы по тегам