假设我有一个LoginView及其数据上下文LoginViewModel,需要注入一个可以根据用户名/密码对用户进行身份验证的服务。
现在让我们说应用程序的状态是有人已经登录,但现在他们正在注销,我需要为下一个用户重新显示登录屏幕。所以在这一点上我需要一个我的LoginViewModel的实例,但我不知道如何去获取它。
我应该将LoginViewModel注入到我的ShellViewModel中并保留并重新使用它吗?这看起来很奇怪,因为在我不使用它的时候,为什么我要将它保留在内存中(在这种情况下授予,但在其他情况下可能不是很大)。
我是否应该将身份验证服务注入ShellViewModel以便在需要创建LoginViewModel时保留?这看起来很奇怪,因为我的ShellViewModel不需要对这个服务做任何事情,如果这是答案,那么我将把所有类型的东西注入我的ShellViewModel中,用于它显示的所有其他ViewModel。
而且我知道我不应该在我的应用程序的根目录之外的任何地方引用我的DI容器,否则我将实现服务定位器模式。
不可否认,我现在感觉非常愚蠢,我确信当我听到答案时,我会打击自己...那么它是什么?
答案 0 :(得分:1)
在这样的场景中,我通常会在您的情况下注入与LoginViewModel工厂相对应的内容。这样,您的逻辑可以根据需要制造新的(或可能由工厂缓存)实例。
答案 1 :(得分:1)
在过去的几个小时里,除了查看关于这个主题的各种博客,问题和答案之后什么都没做,我开始得出结论,像Asp.net MVC这样的框架实现了纯粹主义者&# 39; s(又名像Mark Seemann这样的人)的方法非常可行。
这样的框架倾向于使这成为可能,因为框架本身使用(喘气!!!)服务定位器模式。遗憾的是,在像WPF这样的平台上使用MVVM设计并不容易,因为在内置的服务定位器的帮助下,您的视图不会始终从根目录提供。
但是,我确实有一个ShellViewModel负责显示我需要的大多数视图,因此我认为这里最实用的答案是让我将ShellViewModel视为组合根的一部分并扩展我对DI的依赖容器进入它。除了我的ShellViewModel之外,我相信500的答案是正确的。