WPF で Visual Studio のようなアプリケーションを構築していますが、コンポーネントの最適なアーキテクチャ設計構成を特定するのに問題があります。Unity を依存性注入コンテナーと Visual Studio ユニット テスト フレームワークとして使用し、おそらく moq ライブラリをモック化する予定です。
最初にソリューションの構造を説明し、次に質問を説明します。
以下を含むWPF プロジェクトがあります。
- アプリケーションの起動時 (App.xaml.cs 内) での Unity コンテナーの初期化 (ブートストラップ)
- すべてのアプリケーション ビュー (XAML)。
ViewModelと呼ばれる別のプロジェクトには、以下が含まれます。
- すべてのアプリケーション ViewModels。すべての ViewModels は、ILogger プロパティを公開する ViewModelBase から継承します
私の初期化ロジックは次のとおりです。
- アプリケーションの起動
- Unity コンテナの作成とタイプの登録: MainView および MainViewModel
- MainView を解決して表示します。
var window = Container.Resolve<MainView>();
window.Show();
私の MainView コンストラクターは、そのコンストラクターで MainViewModel オブジェクトを受け取ります。
public MainView(MainViewModel _mvm)
私の MainViewModel には、そのパネルごとに子 ViewModel があります。
public ToolboxViewModel ToolboxVM{get; set;} public SolutionExplorerViewModel SolutionExplorerVM { get; set; } public PropertiesViewModel PropertiesVM { get; set; } public MessagesViewModel MessagesVM { get; set; }
そして、各パネルを初期化する InitializePanels() メソッドを作成する予定です。
ここで私の質問: MainViewModel.InitializePanels() でこれらすべてのパネルを初期化するにはどうすればよいですか? 次のオプションを指定します。
オプション 1: ViewModel を手動で初期化します。
ToolboxVM = new ToolboxViewModel();
//Same for the rest of VM...
短所:
- Unity コンテナーを使用していないため、依存関係 (ILogger など) が自動的に解決されません
オプション 2:プロパティに注釈を付けてセッター インジェクションを使用する:
[Dependency]
public ToolboxViewModel ToolboxVM{get; set;}
//... Same for rest of Panel VM's
短所:
- この場合、Unity との依存関係が生成されるため、Unity Setter の依存関係を避ける必要があることを読みました。
- また、単体テストに Unity を使用しないようにする必要があることも読みましたが、単体テストでこの依存関係を明確にするにはどうすればよいですか? 多くの依存プロパティを持つことは、構成するのに悪夢になる可能性があります。
オプション 3: Unity コンストラクター インジェクションを使用して、すべての Panel ViewModel を MainViewModel コンストラクターに渡し、Unity コンテナーによって自動的に解決されるようにします。
public MainViewModel(ToolboxViewModel _tbvm, SolutionExploerViewModel _sevm,....)
長所:
- 依存関係は作成時に明らかであり、ViewModel UnitTests の構築に役立つ可能性があります。
短所:
- 非常に多くのコンストラクターパラメーターがあると、すぐに醜くなる可能性があります
オプション 4:コンテナーの構築時にすべての VM タイプを登録する。次に、UnityContainer インスタンスをコンストラクター インジェクションを介して MainViewModel に渡します。
public MainViewModel(IUnityContainer _container)
そうすれば、次のようなことができます:
Toolbox = _container.Resolve<ToolboxViewModel>();
SolutionExplorer = _container.Resolve<SolutionExplorerViewModel>();
Properties = _container.Resolve<PropertiesViewModel>();
Messages = _container.Resolve<MessagesViewModel>();
短所:
- 多くの人が示唆しているように、UnitTests に Unity を使用しないことに決めた場合、Panel ViewModel を解決して初期化することはできません。
その長い説明を考えると、依存性注入コンテナーを利用して単体テスト可能なソリューションになるようにするための最良のアプローチは何ですか??
前もって感謝します、