【问题标题】:IoC and User InterfacesIoC 和用户界面
【发布时间】:2008-11-20 00:09:33
【问题描述】:

我正在尝试在我的应用程序中使用 IoC 进行依赖注入的最佳方法,但是我有一个小问题。

我在 WPF 应用程序中使用 MVP 模式的松散实现。本质上,演示者类被实例化,视图和任务(例如 EmployeePresenter 的 IEmployeeView 和 IEmployeeTask)被注入到演示者中。

我想使用 IoC 容器(我正在尝试 Unity,但我想这也会发生在其他人身上,例如 ninject 或 Structure Map)而不是手动注入这些实例,但是如果创建了演示者(或在异步委托调用或事件线程(例如非 STA 线程)上从 IoC 容器解析,然后创建 WPF 窗口的新实例会引发以下异常:

当前的构建操作(构建密钥 构建密钥[命名空间.Window1, null]) failed:调用线程必须是 STA,因为很多 UI 组件 需要这个。

现在,我知道新窗口实例等需要是 STA,但是即使 UI 必须在 STA 线程上创建,是否也可以使用 IoC 容器进行依赖注入?

从这个问题来看,被解析的类/类型似乎是在解析时实例化的,而不是在其注册时...

【问题讨论】:

    标签: wpf dependency-injection inversion-of-control sta


    【解决方案1】:

    我会说使用工厂来创建 Presenter 对象;这样,您可以在 STA 线程中的 PresenterFactory 中创建您的 Presenter 的通用实例,然后在需要时将它们简单地传递出去。

    【讨论】:

      【解决方案2】:

      您的问题与 IoC 无关,只能从创建它的同一线程访问 WPF 对象 - 因此您必须在与 GUI 的其余部分相同的线程上创建演示者(而不仅仅是任何 STA线程)。

      使用 Dispatcher.BeginInvoke 在主线程中运行代码并从那里调用 Ioc contianer。

      【讨论】:

      • 这是最可能的原因,IoC 容器在 WPF 中工作正常。
      【解决方案3】:

      您提到 Unity,您是否考虑过使用也使用它的复合应用程序库? StockTrader 示例应用程序使用 Unity 将视图注入演示模型。如果您不想实际使用 CAL - 更多信息: (http://msdn.microsoft.com/en-us/library/cc707890.aspxhttp://www.codeplex.com/CompositeWPF

      你也许仍然能够弄清楚他们是如何解决这个问题的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        • 2016-07-22
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        相关资源
        最近更新 更多