Внедрение вложенных зависимостей через сбой оболочки свойств - PullRequest
0 голосов
/ 20 апреля 2020

После этого все работало нормально.

Но когда я попробовал то же самое для разрешения вложенной зависимости (у зависимого внедренного класса есть зависимость по очереди - NetworkService В нашем случае), оно сломалось. Что я здесь не так делаю? любая помощь будет высоко оценена.

Сценарий в реальном времени

class AppContainer {
    static let shared = AppContainer()

    var index: [Any] = [NetworkingLibrary(), NetworkService()]

    func resolve<T>(_ type: T.Type) -> T {
        return index.first(where: { $0 as? T != nil }) as! T
    }
}

@propertyWrapper
struct Inject<Value> {
    var value: Value

    var wrappedValue: Value {
        get {
            return value
        }
        set {
            value = newValue
        }
    }

    init(_ container: AppContainer = AppContainer.shared) {
        value = container.resolve(Value.self)
    }
}

class UserService {
    @Inject() var networkLayer: NetworkLayer

    init() { }

    func fetchUsers() {
        networkLayer.fetchData()
    }
}

class PostService {
    @Inject() var networkLayer: NetworkLayer

    init() { }

    func fetchPosts() {
        networkLayer.fetchData()
    }
}

protocol NetworkLayer {
    func fetchData()
}

class NetworkService: NetworkLayer {
    @Inject() var networkLibrary: NetworkingLibraryProtocol //Expecting networkLibrary to be resolved to NetworkingLibrary()
    func fetchData() {
        networkLibrary.fetch()
        print("Fetching Data")
    }
}


let postService = PostService() // crashes here
postService.fetchPosts()

let userService = UserService() // crashes here
userService.fetchUsers()

Код, который вы можете запустить на детской площадке

class AppContainer {
    static let shared = AppContainer()

    var index: [Any] = ["StackOverflow", NetworkService()]

    func resolve<T>(_ type: T.Type) -> T {
        return index.first(where: { $0 as? T != nil }) as! T
    }
}

@propertyWrapper
struct Inject<Value> {
    var value: Value

    var wrappedValue: Value {
        get {
            return value
        }
        set {
            value = newValue
        }
    }

    init(_ container: AppContainer = AppContainer.shared) {
        value = container.resolve(Value.self)
    }
}

class UserService {
    @Inject() var networkLayer: NetworkLayer

    init() { }

    func fetchUsers() {
        networkLayer.fetchData()
    }
}

class PostService {
    @Inject() var networkLayer: NetworkLayer

    init() { }

    func fetchPosts() {
        networkLayer.fetchData()
    }
}

protocol NetworkLayer {
    func fetchData()
}

class NetworkService: NetworkLayer {
    @Inject() var str: String // Expecting str to be resolved to "StackOverflow"
    func fetchData() {
        print(str)
        print("Fetching Data")
    }
}


let postService = PostService()
postService.fetchPosts()

let userService = UserService()
userService.fetchUsers()

Cra sh журнал: -

ошибка: выполнение было прервано, причина: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0). Процесс был оставлен в том месте, где он был прерван, используйте «поток возврата -x», чтобы вернуться в состояние до вычисления выражения.

...