Я пытаюсь понять DI
в Swift.
Я понимаю, что существуют фреймворки, такие как Swinject
и т. Д., Которые могут помочь с DI
, однако я очень хочу понять это сам и не использовать магию слишком многих фреймворков.
Возьмите следующеекод в качестве примера .
Инициализатор моего ProfileService
будет только расти и становиться все толще и толще, так как этот сервис pseudo расширяется и поскольку проектысодержат более одного класса, один и тот же шаблон будет повторяться много раз.
Как этого избежать?Я надеюсь найти способ поддержать простое обслуживание, но при этом получить все преимущества прямого и простого внедрения кода.
Я думал, возможно, использовать Protocol
и Struct
для хранения зависимостей ивпрысните это, но не можете понять, как лучше всего это реализовать.
import UIKit
class UserService {
func currentUser() -> String {
return "some username"
}
}
class AvatarService {
func currentUserAvatarUrl() -> String {
return "https://foo.bar/image.png"
}
}
class MessageService {
func currentInbox() -> [String:String] {
return [
"9279n1n2283":"something something",
"m2j292i2m2n":"something something something"
]
}
}
class ProfileService {
private let userService: UserService
private let avatarService: AvatarService
private let messageService: MessageService
init(userService: UserService, avatarService: AvatarService, messageService: MessageService) {
self.userService = userService
self.avatarService = avatarService
self.messageService = messageService
}
func getLoggedInUser() -> String {
return userService.currentUser()
}
func getUserAvatar() -> String {
return avatarService.currentUserAvatarUrl()
}
func getInboxMessages() -> [String:String] {
return messageService.currentInbox()
}
}
let userService = UserService()
let avatarService = AvatarService()
let messageService = MessageService()
let profileService = ProfileService(userService: userService, avatarService: avatarService, messageService: messageService)
profileService.getLoggedInUser()
profileService.getUserAvatar()
profileService.getInboxMessages()