Skip to content

다른 DI 프레임워크에서 마이그레이션

인기 있는 Swift 의존성 주입 프레임워크에서 WeaveDI로 마이그레이션하는 완전한 가이드입니다.

개요

이 가이드는 다음 프레임워크들로부터의 마이그레이션을 다룹니다:

  • Swinject - 가장 인기 있는 DI 프레임워크
  • Factory - 모던 프로퍼티 래퍼 기반 DI
  • Resolver - 경량 DI 컨테이너

Swinject에서 마이그레이션

주요 차이점

기능SwinjectWeaveDI
등록Container APIContainer + InjectedKey
해결resolve()@Injected + resolve()
스코프Graph, Container, TransientSingleton, Session, Transient
스레드 안전성락 기반락-프리 + TypeID
동시성제한적Swift Concurrency 네이티브
프로퍼티 래퍼사용 불가@Injected, @Factory

등록 마이그레이션

이전 (Swinject):

swift
import Swinject

let container = Container()

// 간단한 등록
container.register(UserService.self) { _ in
    UserServiceImpl()
}

// 의존성 포함
container.register(OrderService.self) { resolver in
    let userService = resolver.resolve(UserService.self)!
    return OrderServiceImpl(userService: userService)
}

// 스코프 포함
container.register(APIClient.self) { _ in
    URLSessionAPIClient()
}.inObjectScope(.container)

이후 (WeaveDI):

swift
import WeaveDI

// 앱 시작 시 부트스트랩
await WeaveDI.Container.bootstrap { container in
    // 간단한 등록
    container.register(UserService.self) {
        UserServiceImpl()
    }

    // 의존성 포함 (자동 해결)
    container.register(OrderService.self) {
        OrderServiceImpl()
    }

    // 스코프 포함
    container.register(APIClient.self, scope: .singleton) {
        URLSessionAPIClient()
    }
}

// 또는 프로퍼티 래퍼 지원을 위해 InjectedKey 사용
struct UserServiceKey: InjectedKey {
    static var liveValue: UserService = UserServiceImpl()
    static var testValue: UserService = MockUserService()
}

extension InjectedValues {
    var userService: UserService {
        get { self[UserServiceKey.self] }
        set { self[UserServiceKey.self] = newValue }
    }
}

해결 마이그레이션

이전 (Swinject):

swift
class ViewController {
    let userService: UserService
    let orderService: OrderService

    init(resolver: Resolver) {
        self.userService = resolver.resolve(UserService.self)!
        self.orderService = resolver.resolve(OrderService.self)!
    }

    // 또는 프로퍼티 주입으로
    var userService: UserService!
}

이후 (WeaveDI):

swift
class ViewController {
    @Injected(\.userService) var userService
    @Injected(\.orderService) var orderService

    init() {
        // 의존성이 자동으로 주입됨
    }
}

// 또는 수동 해결
class ViewController {
    let userService: UserService
    let orderService: OrderService

    init() async {
        self.userService = await UnifiedDI.resolve(UserService.self)!
        self.orderService = await UnifiedDI.resolve(OrderService.self)!
    }
}

다음 단계

MIT 라이선스 하에 릴리스됨.