【问题标题】:How to modify Object in Dependency Injection Pattern如何在依赖注入模式中修改对象
【发布时间】:2019-03-19 23:36:04
【问题描述】:

所以在我从事该项目的时间里,我避免使用单例并使用依赖注入。我的意思是我没有创建共享实例,而是创建了一个类实例并将其传递给所有需要的控制器。

现在我的问题是,我的模型对象在所有控制器中都有引用,我需要将它们指向一个新对象,因为要求数据完全更新,比如再次调用init()

但如果我在某个控制器中这样做,那么该引用将只指向这个新对象。

因此,如果您明白我的意思,我希望引用的指针或该对象在内存地址的位置应该替换为新的,并且所有引用仍应指向该旧地址/新对象。

【问题讨论】:

    标签: ios swift oop dependency-injection pass-by-reference


    【解决方案1】:

    我认为您需要在控制器中注入的不是模型,而是用于获取和保存此模型的服务,就像这样。

    服务协议:

    protocol ModelServiceProtocol {
        func obtainModel(completion: (Model) -> Void)
        func save(model: Model, compleiton: ()->Void)
    }
    

    具有依赖关系的示例 ViewController:

    class ViewController: UIViewController {
        let modelService: ModelServiceProtocol
    
        init(modelService: ModelServiceProtocol) {
            self.modelService = modelService
        }
    
        func obtainModel() {
            modelService.obtainModel { model in
                // do something
            }
        }
    
        func saveEditedModel() {
            modelService.save(model: model) {
                // model saved
            }
        }
    }
    

    实现获取并保存模型的 ModelService:

    class ModelService: ModelServiceProtocol {
        func obtainModel(completion: (Model) -> Void) {
            // implementation of obtainig model from some storage
        }
    
        func save(model: Model, compleiton: ()->Void) {
            // implementation of saving model in some storage
        }
    }
    

    依赖注入:

    func buildController() -> ViewController {
        let modelService = ModelService()
        let viewController = ViewController(modelService: modelService)
        return viewController
    }
    

    在这种方法中,您将在 ViewController 中获得实际模型,编辑并保存到一些存储中。模型在每一步都是真实的

    【讨论】:

    • 好的,我认为这是一种很好的方法,而不是到处引用多个引用,现在只有一个对模型的引用。如果我通过 ModelService 类进行变异,它总是会到处指向新的。但是,如果说我确实在某些控制器中发生了变异并导航回主页/仪表板。我仍然需要刷新 UI 并调用 API。我想我还需要在 ModelService 类中添加一个 didChange 观察者吗?我的控制器会观察它吗?感谢您的解决方案,它非常有条理。
    • 我也遇到过这个叫做模型控制器的东西,和你的类似:swiftbysundell.com/posts/model-controllers-in-swift
    • 是的,您可以添加一些功能来订阅模型更改,或者您可以在 viewController 确实出现时更新您的模型
    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多