【问题标题】:WPF DI Service LocatorWPF DI 服务定位器
【发布时间】:2011-03-24 10:18:19
【问题描述】:

所以我正在寻找一些说明如何从我的应用程序中删除服务定位器。

我有一个 ViewManagerService 负责了解哪个视图处于活动状态、哪些视图处于打开状态并创建一个新视图。

目前,我的 ViewModel 通过构造函数注入将 IViewManagerService 注入其中。这些 ViewModel 公开 ICommand,当被调用时可以调用

viewManager.Transition("MyCoolView", somePrimaryKey);

ViewManagerService 然后使用一个服务定位器来查找和实例化一个新的视图,键为“MyCoolView”。使用密钥字符串的原因是我可以将视图与视图模型分离。我想保持 ViewManagerService 足够通用,以便我可以将它用于其他应用程序,所以我不希望它依赖于特定的 IAbstractFactory 接口。

任何提示/建议?

【问题讨论】:

    标签: wpf dependency-injection service-locator


    【解决方案1】:

    您可以使用 WPF 的 数据模板 引擎完全摆脱魔术字符串。最好的方法是使用MVVM pattern。它与 DI 正交,但却是一个很好的推动者。

    一旦您完成了这种转换,您就可以拥有一个纯 DI 架构,而不必依赖 Service Locator anti-pattern

    【讨论】:

    • 目前我的服务定位器接受“魔术字符串”进行查找并实例化一个视图。然后它为该视图实例化一个特定的 ViewModel 并将其设置为 DataContext。 (使用温莎)。然后它在视图模型上调用 Load(primaryKey) 函数。如果我要使用数据模板引擎,我基本上有一个 ContentPresenter,它的 DataContext 设置为我正在查看的特定 ViewModel 吗?然后我会通过提供它的所有构造函数参数(IViewManagerService 等)来更新我想要转换到的 ViewModel,还是我会以不同的方式来实现?
    • 是的,您可以直接新建 ViewModel,或者,为了更好地解耦,使用抽象工厂。我倾向于后者。
    • 我试试看!查看看起来非常酷的 TypedFactoryFacility。将是一次重大的重写,但我认为这是最好的。非常感谢,我一定会在你的书出版时拿走它:)
    • 是的,由 TypedFactoryFacility 实现的抽象工厂是一个非常酷的组合 :)
    • 我刚刚进行了所有更改,我的代码现在很好看。再次感谢!顺便说一句,期待收到您的书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多