Frage

Ich versuche, meinen Kopf um die beste Art und Weise zu wickeln IoC für Dependency Injection in meiner Anwendung zu verwenden, aber ich ein kleines Problem haben.

ich mit einer WPF-Anwendung, um eine lose Implementierung des MVP-Musters verwenden. Im Wesentlichen wird eine Präsentator Klasse instanziiert und eine Ansicht und Task (z.B. IEmployeeView und IEmployeeTask für EmployeePresenter) in den Moderator eingespritzt.

Ich möchte ein IoC-Container verwenden (ich Unity ausprobieren, obwohl ich das denke, auch mit anderen wie ninject oder Strukturkarte passieren würde) statt Injektion manuell diese Instanzen jedoch, wenn der Moderator erstellt wird (oder gelöst von einem IOC-Containern) auf einem async Delegiertenanruf oder ein Ereignis Thread (zB nicht STA Gewinde) dann eine neue Instanz eines WPF Fensters zu schaffen führt die folgende Ausnahme:

  

Der aktuelle Build-Betrieb (Build Schlüssel   Bauen Sie Taste [ Namespace .Window1, null])   fehlgeschlagen: Der aufrufende Thread sein muss   STA, weil viele UI-Komponenten   dies erfordert.

Nun, ich weiß, dass neue Fenster Instanzen usw. müssen STA sein, jedoch ist es möglich, einen IoC Container zu verwenden, um die Dependency Injection zu tun, auch wenn die Benutzeroberfläche muss auf einem STA-Thread erstellt werden?

Aus bei diesem Problem sucht es scheint, dass die Klasse / Typ aufgelöst wird an der Entschlossenheit Zeit instanziert wird, nicht, wenn sein registriert ...

War es hilfreich?

Lösung

Ich würde sagen, eine Fabrik zu verwenden, um die Presenter-Objekte zu erstellen; auf diese Weise können Sie Ihre allgemeine Instanzen von Präsentatoren aus Ihrem PresenterFactory in einem STA-Thread erzeugen, und dann einfach geben sie, wenn erforderlich.

Andere Tipps

Ihr Problem nichts mit IoC zu tun hat, kann ein WPF-Objekt nur aus dem gleichen Thread zugegriffen werden, die es erstellt - so haben Sie Ihren Moderator auf dem gleichen Thread wie der Rest Ihrer GUI (und nicht nur jede STA erstellen Gewinde).

Verwenden Dispatcher.BeginInvoke Code im Hauptthread zu laufen und ruft Ioc Contianer von dort aus.

Sie erwähnen Unity, haben Sie sah die Composite Application Library unter Verwendung der es auch verwendet? Die Stocktrader Beispielanwendung verwendet Unity Ansichten zu Präsentationsmodelle zu injizieren .. Wenn Sie wirklich wollen nicht die CAL verwenden - weitere Informationen: ( http://msdn.microsoft.com/en-us/library/cc707890 aspx oder http://www.codeplex.com/CompositeWPF )

Sie könnten noch in der Lage sein, herauszufinden, wie sie rund um das Thema bekamen ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top