是的,我相信你可以做得更好。
考虑一下,如果没有按需需求,那么显然您可以使这些视图模型成为MenuViewModel
链上的依赖项,依此类推,直到您到达对象图的根(the ShellViewModel
),并且容器会将所有内容连接起来。
您可以在对象图中放置一个“防火墙”,方法是用可以构造依赖关系的东西来代替依赖MenuViewModel
关系本身。容器是这项工作的明显选择,恕我直言,从实际的角度来看,这是一个足够好的解决方案,即使它不是那么纯粹。
但也可以用专用工厂代替容器;该工厂将依赖容器并为MenuViewModel
. 访问属性将导致容器解析对象并返回它们(访问器方法也可以代替属性工作;更合适的是完全另一个讨论,所以只需使用您认为更好的任何内容)。
看起来你并没有真正改变现状,但如果MenuViewModel
直接依赖容器,情况就不一样了。在那种情况下,通过查看它的公共接口,您将不知道真正的依赖关系MenuViewModel
是什么,而现在您会看到对类似的东西有依赖关系
interface IMenuViewModelDependencyFactory
{
public RealDependencyA { get; }
public RealDependencyB { get; }
}
这提供了更多信息。如果你看一下具体的公共接口的MenuViewModelDependencyFactory
事情也会好很多:
class MenuViewModelDependencyFactory : IMenuViewModelDependencyFactory
{
private Container container;
public MenuViewModelDependencyFactory(Container container) { ... }
public RealDependencyA { get { ... } }
public RealDependencyB { get { ... } }
}
这里不应该混淆MenuViewModelDependencyFactory
容器的用途,因为它非常专业。