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

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

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

  

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

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

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

有帮助吗?

解决方案

我会说使用Factory来创建Presenter对象;这样,您就可以在STA线程中的PresenterFactory中创建Presenters的通用实例,然后在需要时将其传递出去。

其他提示

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top