#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. Похоже, суть вашей проблемы заключается в том, чтобы определить, к чему вы хотите получить доступ, и когда и как это становится доступным. Как получить этот доступ, кажется второстепенным. Поэтому я бы посоветовал вам попытаться ответить на этот первый вопрос, а затем представить его здесь. Или, может быть, кто-то прочитает это и сможет предоставить этот ответ.