Domanda

Sto cercando di avvolgere la mia testa intorno al modo migliore di usare l'IoC nella mia applicazione per l'iniezione di dipendenza, tuttavia ho un piccolo problema.

Sto usando un'implementazione libera del modello MVP con un'app WPF. In sostanza, viene istanziata una classe presentatore e una vista e un'attività (ad es. IEmployeeView e IEmployeeTask for EmployeePresenter) vengono iniettate nel presentatore.

Vorrei usare un contenitore IoC (sto provando Unity, anche se immagino che ciò accadrà anche con altri come ninject o Structure Map) invece di iniettare manualmente queste istanze, tuttavia se il presentatore viene creato (o risolto da un contenitore IoC) su una chiamata delegata asincrona o su un thread di eventi (ad esempio non thread STA) quindi la creazione di una nuova istanza di una finestra WPF genera la seguente eccezione:

  

L'operazione di compilazione corrente (chiave di compilazione   Build Key [ namespace .Window1, null])   non riuscito: il thread chiamante deve essere   STA, perché molti componenti dell'interfaccia utente   richiede questo.

Ora, so che le nuove istanze di finestra, ecc. devono essere STA, tuttavia è possibile utilizzare un contenitore IoC per eseguire l'iniezione delle dipendenze anche quando l'interfaccia utente deve essere creata su un thread STA?

Dall'esame di questo problema sembrerebbe che la classe / il tipo da risolvere sia istanziato al momento della risoluzione, non quando è registrato ...

È stato utile?

Soluzione

Direi di usare una Factory per creare gli oggetti Presenter; in questo modo, puoi creare le tue istanze generiche di Presenter dall'interno di PresenterFactory in un thread STA e poi semplicemente distribuirle quando necessario.

Altri suggerimenti

Il tuo problema non ha nulla a che fare con IoC, un oggetto WPF è accessibile solo dallo stesso thread che lo ha creato, quindi devi creare il tuo presentatore sullo stesso thread del resto della tua GUI (e non solo su qualsiasi STA filetto).

Usa Dispatcher.BeginInvoke per eseguire il codice nel thread principale e chiamare contianer Ioc da lì.

Hai citato Unity, hai mai usato la libreria di applicazioni composite che la usa? L'applicazione di esempio StockTrader utilizza Unity per iniettare visualizzazioni nei modelli di presentazione. Se non si desidera effettivamente utilizzare la CAL - ulteriori informazioni: ( http://msdn.microsoft.com/en-us/library/cc707890 .aspx o http://www.codeplex.com/CompositeWPF )

potresti ancora essere in grado di capire come hanno risolto il problema ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top