我正试图围绕在我的应用程序中使用IoC进行依赖注入的最佳方式,但是我有一点问题。
我正在使用WPF应用程序松散的MVP模式实现。本质上,实例化一个presenter类,并将一个视图和任务(例如,EmployePresenter的IEmployeeView和IEmployeeTask)注入到演示者中。
我想使用IoC容器(我正在尝试使用Unity,虽然我猜这也会发生在ninject或Structure Map等其他人身上),而不是手动注入这些实例,但是如果创建了presenter(或者在异步委托调用或事件线程(例如,不是STA线程)上从IoC容器解析,然后创建WPF窗口的新实例会引发以下异常:
当前构建操作(构建密钥 构建密钥[名称空间 .Window1,null]) 失败:调用线程必须是 STA,因为有很多UI组件 需要这个。
现在,我知道新窗口实例等需要是STA,但是即使必须在STA线程上创建UI,也可以使用IoC容器来执行依赖注入吗?
从查看这个问题看,正在解析的类/类型在解析时被实例化,而不是在注册时...
答案 0 :(得分:2)
我会说使用Factory来创建Presenter对象;这样,您就可以在STA线程中的PresenterFactory中创建Presenters的通用实例,然后在需要时将其传递出去。
答案 1 :(得分:2)
您的问题与IoC无关,WPF对象只能从创建它的同一个线程访问 - 因此您必须在与GUI其余部分相同的线程上创建演示者(而不仅仅是任何STA)线程)。
使用Dispatcher.BeginInvoke在主线程中运行代码并从那里调用Ioc contianer。
答案 2 :(得分:2)
你提到Unity,你看过使用也使用它的复合应用程序库吗? StockTrader示例应用程序使用Unity将视图注入演示模型..如果您不想实际使用CAL - 更多信息: (http://msdn.microsoft.com/en-us/library/cc707890.aspx或http://www.codeplex.com/CompositeWPF)
你可能仍然能够弄清楚他们是如何解决这个问题的。