protocol AwesomeDICProtocol {
func register<T>(type: T.Type, dependency: Any) // 의존성 등록
func resolve<T>(type: T.Type) -> T? // 의존성 해결
}
final class DIContainer: AwesomeDICProtocol {
static let shared = DIContainer()
// 의존성을 등록할 딕셔너리를 선언합니다.
private var dependencies: [String: Any] = [:]
// 의존성을 등록하는 메서드
func register<T>(type: T.Type, dependency: Any) {
let key = String(describing: type)
dependencies[key] = dependency
}
// 의존성을 해결하는 메서드
func resolve<T>(type: T.Type) -> T? {
let key = String(describing: type)
return dependencies[key] as? T
}
private init() {} // 외부에서 추가 생성 방지
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let container = DIContainer.shared
container.register(type: ToDoCRUDProtocol.self, dependency: ToDoManager())
// TodoManager 의존성 등록
// TodoManager 의존성 주입도 여기서 하면 됩니다. 전 이번에 SB 를 사용했기때문에 viewDidLoad 에 했습니다.
return true
}
// 뷰컨트롤러 : 스토리보드를 사용해서 여기에!!
override func viewDidLoad() {
super.viewDidLoad()
viewModel = ToDoViewModel(todoService: DIContainer.shared.resolve(type: ToDoCRUDProtocol.self)!) // SB이라서 여기에 의존성 주입... ViewModel에 Service 주입
setup()
}
protocol ToDoCRUDProtocol {
var items: [ToDo] { get set }
func addItem(item: ToDo)
func deleteItem(at index: Int)
}
// ToDo CRUDServiceable 구현
final class ToDoManager: ToDoCRUDProtocol {
var items: [ToDo] = []
func addItem(item: ToDo) {
items.append(item)
}
func deleteItem(at index: Int) {
if index < items.count {
items.remove(at: index)
}
}
}
import Foundation
class ToDoViewModel {
let todoService: ToDoCRUDProtocol // 주입 받을 서비스
// 초기화
init(todoService: ToDoCRUDProtocol) {
self.todoService = todoService
}
var todos: [ToDo] {
return todoService.items
}
var todosCount: Int {
return todoService.items.count
}
func addNewToDo(item: ToDo) {
todoService.addItem(item: item)
}
func deleteToDo(at index: Int) {
todoService.deleteItem(at: index)
}
}
의존성 주입 컨테이너를 사용하여 의존성 주입을 하는 순서는 다음과 같다.