2

假设我有一个 LoginView,它的数据上下文 LoginViewModel 需要注入一个可以根据用户名/密码对用户进行身份验证的服务。

现在假设应用程序的状态是有人已经登录,但现在他们正在注销,我需要为下一个用户重新显示登录屏幕。所以此时我需要一个我的 LoginViewModel 的实例,但我不确定如何获取它。

我是否应该将 LoginViewModel 注入我的 ShellViewModel 并持有并重用它?这看起来很奇怪,因为我为什么要在不使用它的时候将它保存在内存中(当然,在这种情况下没什么大不了的,但可能适用于其他情况)。

我是否应该将身份验证服务注入 ShellViewModel 以在需要创建 LoginViewModel 时保留?这看起来很奇怪,因为我的 ShellViewModel 不需要对这个服务做任何事情,如果这是答案,那么我会为它显示的所有其他 ViewModel 注入各种东西到我的 ShellViewModel 中。

而且我知道我不应该在我的应用程序根以外的任何地方引用我的 DI 容器,否则我将实施服务定位器模式。

诚然,我现在感觉很愚蠢,当我听到答案时,我敢肯定我会扇自己耳光……那是什么?

4

2 回答 2

1

在过去几个小时里除了查看关于这个主题的各种博客、问题和答案之外什么都没做,我开始得出结论,像 Asp.net MVC 这样的框架可以实现一个纯粹主义者(也就是像 Mark Seemann 这样的人) ) 方法相当可行。

这样的框架倾向于使这成为可能,因为框架本身利用了(喘气!!!)服务定位器模式。不幸的是,在像 WPF 这样的平台上使用 MVVM 设计并不那么容易,因为在内置服务定位器的帮助下,您的视图并不总是从根目录提供服务。

但是,我确实有一个 ShellViewModel 负责显示我需要的大部分视图,所以我认为这里最实用的答案是让我将 ShellViewModel 视为组合根的一部分,并将我对 DI 容器的依赖扩展到它.

不过,除了我的 ShellViewModel 之外,我相信 500 的答案是正确的。

于 2013-01-31T21:34:34.057 回答
1

在这样的场景中,我通常会在您的情况下注入与 LoginViewModel 工厂相对应的内容。这样,您的逻辑可以根据需要制造一个新的(或可能由工厂缓存的)实例。

于 2013-01-31T17:41:16.290 回答