swift - 属性包装器到属性包装器
问题描述
我用 Swinject 制作了一个 IOC 容器来管理我的依赖注入,并且我尝试将它与一些属性包装器配对:
@propertyWrapper
struct Inject<T:ObservableObject>{
let wrappedValue: T = SwinjectContainer.resolve(ObjectType: T.self)
}
下一步是在我的视图中使用这个属性包装器......但是使用另一个属性包装器@StateObject
,但这会出错,因为我的包装值与 objectType 不匹配@StateObject
,它需要是一个ObservableObject
.
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()
}
}
}
这是管理我的依赖注入的好方法吗,有可能吗?
解决方案
SwiftUI 视图中的依赖注入通过 效果最好@EnvironmentObject
,但这可能不适合您的用例。此外,问题中的代码看起来也不符合 DI 的条件。
ViewModel 应该由 View 直接实例化,或者在初始化时从上游注入。虚拟机不会在整个应用程序中传播,它们应该本地化到应用程序的 UI 所在的部分。
依赖注入应该保留给全局对象,例如 API 客户端、缓存提供程序、持久性管理器等。这些对象应该由 ViewModel 对象使用,并且您可以在 VM 的层次结构上使用 Swinject。
通过这种方式,您还可以很好地分离关注点:SwiftUI 视图仅呈现 VM 提供的数据,并在需要时根据用户交互向它们发送命令。然后,视图不知道除 VM 之外的任何其他业务对象,而 VM 依赖注入的对象来完成工作。
推荐阅读
- wordpress - Slick Slider - 从左向右滑动
- sqlite - 获取重复的输出并且与另一列不同
- javascript - 使用id递归删除json对象
- java - 具有一对多关系字段的比较器
- java - 如何在每个活动的顶部显示消息?
- xml - 无法接收带有 Angular 7 注入的 http 类的 XML 结构
- java - 由于 AJP 未能与后端建立连接,连接被拒绝
- performance - libsvm compiled with AVX vs no AVX
- javascript - 如何获取元素的完整 CSS(类、内联、@import、@media)
- c# - 创建系统类型的自定义方法