0

依存性注入のためにアプリケーション内で IoC を使用する最善の方法について頭を悩ませようとしていますが、少し問題があります。

WPF アプリで MVP パターンの緩やかな実装を使用しています。基本的に、プレゼンター クラスがインスタンス化され、ビューとタスク (EmployeePresenter の IEmployeeView と IEmployeeTask など) がプレゼンターに挿入されます。

これらのインスタンスを手動で注入する代わりに、IoC コンテナーを使用したいと思います (Unity を試していますが、これは ninject や Structure Map などの他のものでも発生すると思います)。 IoC コンテナー) を非同期デリゲート呼び出し、またはイベント スレッド (例: STA スレッドではない) で呼び出してから、WPF ウィンドウの新しいインスタンスを作成すると、次の例外がスローされます。

現在のビルド操作 (ビルド キー Build Key[ namespace .Window1, null]) が失敗しました: 多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。

さて、新しいウィンドウ インスタンスなどを STA にする必要があることはわかっていますが、UI を STA スレッドで作成する必要がある場合でも、IoC コンテナーを使用して依存関係の挿入を行うことは可能ですか?

この問題を見ると、解決されているクラス/タイプは、登録時ではなく、解決時にインスタンス化されているように見えます...

4

3 に答える 3

2

Factoryを使用してPresenterオブジェクトを作成すると言います。このようにして、STAスレッドのPresenterFactory内からPresenterの汎用インスタンスを作成し、必要に応じてそれらを渡すことができます。

于 2008-11-20T00:19:34.087 に答える
2

問題はIoCとは関係ありません。WPFオブジェクトには、それを作成したのと同じスレッドからのみアクセスできます。そのため、GUIの他の部分(STAスレッドだけでなく)と同じスレッドでプレゼンターを作成する必要があります。

Dispatcher.BeginInvokeを使用してメインスレッドでコードを実行し、そこからIoccontianerを呼び出します。

于 2008-11-20T10:56:20.510 に答える
2

Unity について言及されましたが、それを使用する Composite Application Library の使用を見たことがありますか? StockTrader サンプル アプリケーションでは、Unity を使用してプレゼンテーション モデルにビューを挿入します。実際に CAL を使用したくない場合は、詳細情報: ( http://msdn.microsoft.com/en-us/library/cc707890.aspxまたはhttp://www.codeplex.com/CompositeWPF )

彼らがどのように問題を回避したか、まだ解決できるかもしれません..

于 2008-11-20T17:46:15.627 に答える