はい、私はあなたがもう少し良いことをすることができると信じています。
オンデマンド要件がない場合MenuViewModel
は、オブジェクトグラフ()のルートに到達しShellViewModel
、コンテナがすべてを接続するまで、これらのビューモデルをチェーンの依存関係などにすることができることを考慮してください。
MenuViewModel
依存関係自体をの依存関係を構築できるものに置き換えることで、オブジェクトグラフに「ファイアウォール」を配置できます。コンテナはこの仕事の明白な選択であり、実用的な観点からは、これはそれほど純粋ではない場合でも十分な解決策です。
ただし、コンテナの代わりに専用の工場を代用することもできます。このファクトリはコンテナへの依存関係を取り、の実際の依存関係に対して読み取り専用プロパティを提供しますMenuViewModel
。プロパティにアクセスすると、コンテナがオブジェクトを解決して返すようになります(プロパティの代わりにアクセサメソッドも機能します。より適切なのは完全に別の議論なので、あなたがより良いと思うものを使用してください)。
現状を実際に変更していないように見えるかもしれませんがMenuViewModel
、コンテナに直接依存している場合と同じ状況ではありません。MenuViewModel
その場合、パブリックインターフェイスを見ると、実際の依存関係が何であるかわかりませんが、次のようなものに依存関係があることがわかります。
interface IMenuViewModelDependencyFactory
{
public RealDependencyA { get; }
public RealDependencyB { get; }
}
これははるかに有益です。MenuViewModelDependencyFactory
そして、具体的なもののパブリックインターフェイスを見ると、はるかに優れています。
class MenuViewModelDependencyFactory : IMenuViewModelDependencyFactory
{
private Container container;
public MenuViewModelDependencyFactory(Container container) { ... }
public RealDependencyA { get { ... } }
public RealDependencyB { get { ... } }
}
MenuViewModelDependencyFactory
非常に高度に専門化されているため、ここでコンテナをどのように処理するかについて混乱することはありません。