对模型使用单例或将模型注入视图模型的位置

本文关键字:模型 注入 视图 位置 单例 | 更新日期: 2023-09-27 18:30:38

通常我只会对模型类日志使用单例模式。 但是,我正在尝试学习 DI,并希望将模型注入到我的视图模型中。 此外,我计划为可能需要也可能不需要访问模型的各种功能打开不同的子窗口(选择要显示的日志条目、排序顺序、添加日志条目等)。 使用具有这些约束的单例模式与 DI 的优缺点是什么? 此外,如果我的许多视图模型需要访问此模型,是否可以使用 DI? 最后,我应该在哪里/如何实例化视图、视图模型和模型以便能够注入?

对模型使用单例或将模型注入视图模型的位置

当你使用依赖关系注入时,这个想法是为类提供它所需的依赖关系的特定实现,所以当你进行单元测试时,你可以提供一个模拟或存根实现。这称为松耦合。

同时,单例是您无法控制的全局状态。如果您的类访问单一实例,它将与单一实例紧密耦合。你如何嘲笑单身人士?一般来说,你不会。你坚持下去,突然间你就有了无法测试的代码。正是由于这个原因,单例通常被认为是一种反模式。(旁白:有办法解决这个问题,但基本设计问题仍然存在)

更糟糕的是,如果你的类中的某些东西改变了单例的状态,这可能会在你正在编写的其他测试中产生副作用,并且很难弄清楚为什么测试 B 在单独运行时通过,但如果它在测试 A 之后运行失败。

我的经验法则是永远不要使用单例

你的具体问题听起来有点可疑。您的视图模型不需要注入其中的模型。听起来你想要一个负责检索或以其他方式构造模型的类,然后将该类的实现注入到你的视图模型中。