【问题标题】:How do I inject dependencies to user controls in WPF如何将依赖项注入 WPF 中的用户控件
【发布时间】:2010-03-09 12:16:56
【问题描述】:

向 WPF 中的用户控件透明地注入依赖项(使用 IOC 容器)的最佳方法是什么?

我假设用户控件是窗口或其他用户控件的 XAML 的一部分。 我也认为父母(不管是谁)不应该对此负责。从父级手动注入依赖项的解决方案对我来说看起来不够干净。我想避免显式管理组件的依赖关系,因为它违背了 IOC 的想法。

在创建逻辑树时是否会引发任何事件,以便我可以拦截它并注入我的依赖项?

编辑: 依赖关系是指 ViewModel、Controller、Presenter(无论使用什么模式)

谢谢, 安德烈

【问题讨论】:

    标签: .net wpf wpf-controls


    【解决方案1】:

    在 WPF 中处理依赖关系的最佳方法是遵循 MVVM pattern

    简而言之,您不会将依赖项直接注入到用户控件(视图)中,而是注入到它们的DataContext(视图模型)中。

    【讨论】:

    • 当然,但是 ViewModel 只是依赖的示例
    • 那么如何将 ViewModel 注入到用户控件中呢?
    • 设置 DataContext 属性。
    • 来自家长控制?这意味着父级应该能够为用户控制创建 ViewModel(使用对容器或抽象工厂的访问)。我也不喜欢父母照顾孩子依赖的想法——这违反了 IoC 的想法。无论如何,这实际上是我现在的做法,但正在寻找更好的方法。
    • ViewModel 是我的视图的实现细节,理想情况下没有人应该知道它的存在(包括控件父级的 ViewModel)。每次我将控件放入 XAML 时,我都不想担心初始化 control.ViewModel。理想情况下...
    【解决方案2】:

    FrameworkElement 有一个 Initialized 事件,您可以连接并注入依赖项。您应该测试它对于您的场景是否足够早。

    【讨论】:

    • 看起来它发生在执行视图 ctor 时(来自 InitializeComponent)。 _container.Resolve() mainView.Initialized += mainView_Initialized; // 永远不会发生 mainView.Show();
    【解决方案3】:

    我这样做的方式是拥有一个整体应用程序类,它将依赖项注入您的视图模型类(假设您使用 MVVM 设计模式?) - 使用像 Unity 这样的 DI 容器。请参阅 WPF 应用程序框架 (https://github.com/jbe2277/waf),其中包含您所描述的此类场景的示例。

    【讨论】:

    • 不确定我是否了解您如何从应用程序访问用户控件。无论如何,这是我想要避免的 - 管理依赖项。
    • 依赖关系的注入可以由像 Unity 这样的依赖容器来处理。我不知道你的具体情况,但看起来你没有使用数据绑定(更不用说 MVVM)?如果是这样,我建议您进一步研究这些方面 - WPF 的很多功能都归功于这些技术。
    • 不,我使用的是 MVVM,但这没关系。问题是关于使用 IOC 容器注入依赖项的原因(同样不重要)。
    【解决方案4】:

    我也被这个思维障碍所困扰:

    我也认为父母(无论是谁) 不应该对此负责。

    那谁会呢? IoC 的重点是其他东西(父级、视图模型、...)定义了依赖关系。

    【讨论】:

    • 老我知道,但他正在寻找一个巧妙的解决方案来触发IoC Container 注入这些依赖项。
    【解决方案5】:

    解决问题的一种可能方法是采用“ViewModel First”方法并使用约定优于配置。

    【讨论】:

    • 这篇文章如何充分回答这个问题?使用 viewmodel-first 与为用户控件指定 ctor 参数有什么关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2014-03-05
    • 2011-11-27
    相关资源
    最近更新 更多