Получить дескриптор текущей транзакции в методе интерфейса

#kotlin #jdbi #jdbi3-core

#kotlin #jdbi #jdbi3-ядро

Вопрос:

Я пытаюсь получить доступ к текущей транзакции handle JDBI в моем методе интерфейса, цель этого — избежать передачи в handle качестве аргумента методам интерфейса, тем самым сохраняя интерфейс свободным от каких-либо деталей реализации. Следующий пример демонстрирует, каков предполагаемый вариант использования.

У меня есть UserApplicationService управление используемой транзакцией

 class UserApplicationService(val jdbi: Jdbi, val userRepository: UserRepository) {

    fun changeUserName() {
        jdbi.useTransaction<Exception> {
            userRepository.updateName("peter pan")
        }
    }
}
  

У меня есть UserRepository интерфейс

 interface UserRepository {
    fun updateName(name: String)
}
  

У меня есть PostgresUserRepository реализация интерфейса

 class PostgresUserRepository: UserRepository {
    override fun updateName(name: String) {
        val handle: Handle = getHandle() // some method to get the handle of the transaction, this is what I need help solving
        handle.execute("...") // set new name of user using the handle
    }
}
  

Любые предложения о том, как решить эту проблему, будут с благодарностью приняты.

Комментарии:

1. Мне кажется, что вы хотели бы передать что-то конструктору PostgresUserRepository , что позволило бы вам позже получить доступ к дескриптору транзакции. Поскольку этот объект является деталью реализации интерфейса, для него хорошо знать об этой конкретной вещи. Вероятно, это будет то, что вы бы внедрили в объект во время создания. Другим вариантом может быть какая-то глобальная переменная, например, одноэлементный объект определенного класса, который мог бы предоставить дескриптор. Именно то, что лучше всего в вашем случае, будет зависеть от того, как определена остальная часть вашего приложения.

2. @Steve Не уверен, что я бы передал в конструктор PostgresUserRepository , за исключением, может Jdbi быть, объекта на случай, если в нем есть какой-то метод для получения текущей транзакции. Что касается одиночек; у вас есть пример такой реализации?

3. Одноэлементный шаблон — это класс со статическим методом get (), который возвращает экземпляр класса. При первом вызове он выделяет экземпляр объекта, сохраняет ссылку на этот объект и возвращает ссылку. при последующих вызовах он возвращает существующий объект по этой ссылке. Поскольку вы можете вызвать метод статического класса из любого места в вашем коде без контекста, он в основном глобальный, т.Е.: MySingletonClass msc = MySingletonClass.get();

4. Похоже, суть вашей проблемы заключается в том, чтобы определить, к чему вы хотите получить доступ, и когда и как это становится доступным. Как получить этот доступ, кажется второстепенным. Поэтому я бы посоветовал вам попытаться ответить на этот первый вопрос, а затем представить его здесь. Или, может быть, кто-то прочитает это и сможет предоставить этот ответ.