0

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

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

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

当前构建操作(构建键 Build Key[ namespace .Window1, null])失败:调用线程必须是 STA,因为许多 UI 组件都需要这个。

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

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

4

3 回答 3

2

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

于 2008-11-20T00:19:34.087 回答
2

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

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

于 2008-11-20T10:56:20.510 回答
2

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

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

于 2008-11-20T17:46:15.627 回答