Roger Cyr
06/06/2021, 4:31 PMCLOVIS
06/06/2021, 5:26 PMRoger Cyr
06/06/2021, 5:38 PMAlex Johnson
06/06/2021, 8:26 PMdata class User(
val username: String
)
interface HasUserRepository {
fun UserRepository(): UserRepository
}
suspend fun <ENV> ENV.loadUser(name: String): Either<StudioError, User>
where ENV : HasUserRepository = either {
userRepository().findOneByName(name).bind()
}
For instance if we create a concrete implementation named ApiEnvironment that provides the HasUserRepository trait we can then have a query endpoint such as (dataFetcherResult translates the result or error to an appropriate result, using the error handler if necessary):
class UserQuery(env: ApiEnvironment) {
suspend fun user(username: String): DataFetcherResult<User> =
env.loadUser(username).dataFetcherResult(errorHandler)
}
and a simple implementation of the environment:
interface ApiEnvironment : HasUserRepository {
companion object {
operator fun invoke(): BundleQueryEnvironment {
return object : ApiEnvironment,
HasUserRepository by HasUserRepository(UserRepositoryImplementation()) {}
}
}
}
Then if you utilize spring, koin, or any other DI framework you can create an implementation utilizing that library, if desired as well.Roger Cyr
06/06/2021, 8:33 PMRoger Cyr
06/06/2021, 8:36 PMAlex Johnson
06/06/2021, 9:01 PMCLOVIS
06/07/2021, 11:26 AMinterface ApiEnvironment : HasUserRepository {
companion object : ApiEnvironment, HasUserRepository by UserRepositoryImplementation()
}
Alex Johnson
06/07/2021, 2:04 PM