2016-11-12 7 views
0

シンプルインジェクタを使用して依存関係を注入するにはどうすれば新しいビュー/ウィンドウを開くことができますか?単純なインジェクタを使用して新しいビューを開くWPF

私は、簡単な注射器を使用してWPFアプリケーションを起動することができ、問題がある:どのように私はすでに、この質問には、すべてのデザインとシンプルなインジェクターについてです

答えて

1

を起動すると、私のウィンドウ/ビューから新しいウィンドウ/ビューを開くことができますcomposition rootのどこかの実装の詳細です。

私はWindowsフォームに関する同様の質問に別のanswerをここに書きました。その答えのアイデアは、WPFではそれほど違いはありません。 - メインウィンドウ以外に何個のウィンドウが必要ですか? - 他のウィンドウも他のウィンドウに移動する必要があるか、またはメインウィンドウからのみ開くかどうかを指定します。ウィンドウ - ウィンドウのライフスタイルは何ですか?アプリケーションがわずか数窓で構成され、ウィンドウがシングルトンのライフスタイルを持つことができる場合は、アプリケーション

  1. の完全な寿命のために、本当にシングルトンているウィンドウを作成するために、一般的にかなり難しいです、ただで必要なウィンドウを置きますメインウィンドウのコンストラクタです。ライフスタイルをシングルトンにすることができない場合は、ウィンドウごとにFunc<T>ファクトリメソッドを挿入できます。
  2. コンポジションルートの最初またはメインウィンドウを作成します。コンテナをコンストラクタパラメータとして入れ、それを表示する前に他のウィンドウを直接コンテナから解決します。この場合、このウィンドウの唯一の責任は、アプリケーションウィンドウのオープン/表示でなければなりません。
  3. も実装してINavigationServiceを作成構図ルート
  4. の一部はCaliburn MicroのようなMVVMツールを使用して、完全な設計変更を作るシンプルなインジェクターコンテナ
  5. に直接カリバーンブートストラップクラスにGetInstance()メソッドをリダイレクト..

可能性1,2,4は実装するのが簡単です。最も単純な形式でNavigationServiceも非常に簡単ですし、次のようになります。

public class NavigationService : INavigationService 
{ 
    private readonly Container container; 

    public NavigationService(Container container) 
    { 
     this.container = container; 
    } 

    public void ShowView<TView>() where TView : Window 
    { 
     var view = this.CreateWindow<TView>(); 

     view.Show(); 
    } 

    public bool? ShowDialog<TView>() where TView : Window 
    { 
     var view = this.CreateWindow<TView>(); 

     return view.ShowDialog(); 
    } 

    private Window CreateWindow<TView>() where TView : Window 
    { 
     return this.container.GetInstance<TView>(); 
    } 
} 

我々はしかし、これに別の角度を取るならば、我々は処理のために、この設計の本質でUIバージョンのデザインを作成することができますcommandsおよびqueries。これらのパターンは、ビジネス層側とUI側の両方で、実際にあなたの問題を解決します。

ほとんどのLOBアプリケーションでは、画面を通常選択して選択または選択できるようになり、別の部分はユーザーがデータを入力してこれを一部のデータストアに保存する画面になります。この懸念を抽象的なレベルから見ると、ユーザーにインタラクションをさせるためにUIの部分がこれを処理することは実際問題ではありません。特定のサービスのデータを照会または編集するサービスと考えることができます。これはWebサービスだけでなく、直接ユーザーも可能です。いくつかの簡単なインターフェースを定義することにより

、と私たちはこれを行うのViewModelの実装を作成することができますMVVMデザインパターンを使用します。

public interface IEditViewModel<TEntity> 
{ 
    EditResult EditEntity(TEntity entityToEdit, DialogHandler dialogHandler); 
} 

public interface IChooseViewModel<TEntity> 
{ 
    TEntity ChooseEntity(DialogHandler dialogHandler); 
} 

public class ChooseEntityService 
{ 
    private readonly Container container; 
    private readonly DialogHandler dialogHandler; 

    public ChooseEntityService(Container container, DialogHandler dialogHandler) 
    { 
     this.container = container; 
     this.dialogHandler = dialogHandler; 
    } 

    public TEntity ChooseEntity<TEntity>() 
    { 
     var viewModel = this.container.GetInstance<IChooseViewModel<TEntity>>(); 
     return viewModel.ChooseEntity(this.dialogHandler); 
    } 
} 

我々はChooseServiceを注入顧客を選択する必要がウィンドウで。このサービスは正しい実装を見つけ、DialogHandlerは、お気に入りのMVVMツールを介してビューを表示する実装になります。

This answerについては、このデザインで詳しく説明します。

関連する問題