我已经使用Clean Architecture构建了应用程序,现在我计划将网络层验证添加到其中.
下面是我如何在我的应用程序中实现这一点的代码.
interface JokeApi {
@GET("joke/Any")
suspend fun getJoke(): Response<JokeResponseDto>
}
class JokeRepositoryImpl @Inject constructor(private val jokeApi: JokeApi) : JokeRepository {
override suspend fun getJoke(): NetworkResponse<JokeResponse> {
return handleApiResponse { jokeApi.getJoke() }
}
}
- HandleApiResponse函数返回类型为
NetworkResponse<JokeResponseDto>
suspend fun <T> handleApiResponse(execute: suspend () -> Response<T>): NetworkResponse<T> {
return try {
val response = execute()
val body = response.body()
if (response.isSuccessful && body != null) {
NetworkResponse.Success(data = body)
} else {
NetworkResponse.Error(errorMessage = response.message())
}
} catch (exception: HttpException) {
NetworkResponse.Error(errorMessage = exception.localizedMessage)
} catch (throwable: Throwable) {
NetworkResponse.Exception(throwable = throwable)
}
}
sealed class NetworkResponse<T>(
val data: T? = null,
val errorMessage: String? = null,
val exception: Throwable? = null,
) {
class Success<T>(data: T) : NetworkResponse<T>(data = data)
class Error<T>(errorMessage: String?) : NetworkResponse<T>(errorMessage = errorMessage)
class Exception<T>(throwable: Throwable) : NetworkResponse<T>(exception = throwable)
}
在这种情况下,问题是改进返回JokeResponseDto
响应对象,其中JokeRepositoryImpl
预期JokeResponse
的AS getJoke
函数在此代码mapping
中的情况下是有效的.
我try 在handleApiResponse方法中添加映射,因为它是泛型类型,所以没有过多考虑实现.
下面是我如何try 将响应转换为另一个仅具有必要细节的对象.
class JokeResponseMapper : Mapper<JokeResponseDto, JokeResponse> {
override fun mapFrom(from: JokeResponseDto): JokeResponse {
return JokeResponse(
error = from.error,
type = from.type.orEmpty(),
setUp = from.type,
joke = from.joke,
)
}
}
interface Mapper<F, T> {
fun mapFrom(from: F): T
}
任何代码方面的帮助都将不胜感激.