Question

J'essaie de comprendre la meilleure façon d'utiliser IoC dans mon application pour l'injection de dépendance, mais j'ai un petit problème.

J'utilise une implémentation libre du modèle MVP avec une application WPF. Une classe de présentateur est essentiellement instanciée et une vue et une tâche (par exemple, IEmployeeView et IEmployeeTask for EmployeePresenter) sont injectées dans le présentateur.

J'aimerais utiliser un conteneur IoC (j'essaie d'Unity, bien que cela se produise également avec d'autres tels que ninject ou Structure Map) au lieu d'injecter manuellement ces instances, mais si le présentateur est créé (ou résolus à partir d’un conteneur IoC) lors d’un appel délégué asynchrone ou d’un thread d’événement (par exemple, non threadé STA), puis la création d’une nouvelle instance d’une fenêtre WPF lève l’exception suivante:

  

L'opération de construction actuelle (clé de construction   Clé de construction [ espace de noms .Window1, null])   échoué: le fil d'appel doit être   STA, car de nombreux composants de l'interface utilisateur   besoin de cela.

Maintenant, je sais que les nouvelles instances de fenêtre, etc., doivent être STA. Cependant, est-il possible d'utiliser un conteneur IoC pour effectuer l'injection de dépendance même lorsque l'interface utilisateur doit être créée sur un thread STA?

En regardant ce problème, il semblerait que la classe / type en cours de résolution soit instancié au moment de la résolution, pas quand il est enregistré ...

Était-ce utile?

La solution

Je dirais d'utiliser une fabrique pour créer les objets du présentateur; De cette façon, vous pouvez créer vos instances génériques de présentateurs à partir de votre PresenterFactory dans un thread STA, puis simplement les transmettre si nécessaire.

Autres conseils

Votre problème n'a rien à voir avec IoC. Vous ne pouvez accéder à un objet WPF qu'à partir du même thread qui l'a créé - vous devez donc créer votre présentateur sur le même thread que le reste de votre interface graphique (et pas n'importe quel STA fil).

Utilisez Dispatcher.BeginInvoke pour exécuter le code dans le thread principal et appeler Ioc contianer à partir de là.

Vous avez parlé d'Unity, avez-vous envisagé d'utiliser la bibliothèque d'applications composites qui l'utilise également? L'exemple d'application StockTrader utilise Unity pour injecter des vues dans les modèles de présentation. Si vous ne souhaitez pas utiliser réellement la licence d'accès client, vous disposez de plus d'informations: ( http://msdn.microsoft.com/en-us/library/cc707890 .aspx ou http://www.codeplex.com/CompositeWPF )

vous pourrez peut-être encore comprendre comment ils ont résolu le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top