属性包装器到属性包装器

Posted

技术标签:

【中文标题】属性包装器到属性包装器【英文标题】:Property wrapper into property wrapper 【发布时间】:2021-03-09 16:13:21 【问题描述】:

我已经使用 Swinject 制作了一个 IOC 容器来管理我的依赖注入,并且我尝试将它与一些属性包装器配对:

@propertyWrapper
struct Inject<T:ObservableObject>
    let wrappedValue: T = SwinjectContainer.resolve(ObjectType: T.self)

下一步是在我的视图中使用这个属性包装器......但是使用另一个属性包装器@StateObject,但这会出错,因为我的包装值与@StateObjectobjectType 不匹配,它需要是@987654324 @。

struct MyView: View 
    
    @StateObject @Inject var VM:MyViewModel
    
    var body: some View 
        VStack
            Text("\(VM.A ?? 23)")
            Button(action: VM.B())
                Text("click")
            
        
        .onAppear
            VM.appear()
        
    


这是管理我的依赖注入的好方法吗?有可能吗?

【问题讨论】:

你应该使用@State而不是@StateObject 【参考方案1】:

SwiftUI 视图中的依赖注入通过@EnvironmentObject 效果最好,但是这可能不适合您的用例。此外,问题中的代码看起来也不符合 DI 的条件。

ViewModel 应该由 View 直接实例化,或者在初始化时从上游注入。 VM 不会在整个应用程序中传播,它们应该被本地化到应用程序的 UI 所在的部分。

应该为全局对象保留依赖注入,例如 API 客户端、缓存提供程序、持久性管理器等。这些对象应该由 ViewModel 对象使用,并且您可以在 VM 的层次结构上使用 Swinject。

通过这种方式,您还可以很好地分离关注点:SwiftUI 视图仅呈现 VM 提供的数据,并在需要时根据用户交互向它们发送命令。然后,视图不知道除了 VM 之外的任何其他业务对象,而 VM 依赖注入的对象来完成工作。

【讨论】:

以上是关于属性包装器到属性包装器的主要内容,如果未能解决你的问题,请参考以下文章

C# 包装器到 C++ 函数 - 运行一次,工作正常。运行两次,程序挂起

Json解析器到Android中的RecyclerView? [关闭]

Swift - 无法识别的选择器到实例 - UITapGestureRecognizer

打字稿捆绑器到打字稿文件

从朴素贝叶斯分类器到贝叶斯网络(下)

jQuery 选择器到 JSON 对象表示