0

私はWPFベースのアプリケーションを構築しています。私はUnityを使用して、アプリケーション(App.xaml.csで定義されています)のさまざまな依存関係をすべて注入しています。 私のMainApplicationウィンドウには、Controlから派生したかなり複雑なルックレスカスタムコントロールがあります(これにはさらに10個のコントロールが統合されています)。 私はこのカスタムコントロールに、アプリケーション内の他のオブジェクト(もちろんApp.xaml.csを除く)に結合することなくVMを注入したいと思います。Unityを使用してWPFのカスタムコントロールにVMを注入します。

私のアプリケーションの任意のWPFウィンドウへの注入はうまくいくが、私は別の状況に直面していますカスタムコントロールに注入してみてください。 1.私は container.RegisterInstance(container.Resolve)を使用していた場合には、

DIはMyCustomControlのダミーのインスタンスを作成し、VM(使用[依存]属性)を注入します。

が、その場合には、それはすべての依存関係を無視して新しいMyCustomControlを初期化します:私は私のXAMLでそれを使用する場合しかしながら、この特定のインスタンスが使用されていません。

  1. ケースを使用している場合は container.RegisterType();

MyCustomControlは完全に注射を無視します。

は、私はおそらく何か間違ったことを(だけでなく、技術的に)やって実現し、私は実際に(明らかに問題を解決します)、この制御をカップリングを避けるためにしようとしています。

答えて

0

これが最善のソリューションであり、残念ながら、他のオプションを探しているが、一方で、あなたの質問を見つけた場合、私は知りませんが、ここで私は、少なくとも起動して実行するのに使用されるアプローチです。

私は、コントロールをサブクラス基本UnityControlクラスを作成しました。コンストラクタでは、ServiceLocatorを使用してコンテナへの参照を取得します。次に、BuildUpメソッドを呼び出して、派生したコントロールクラスの依存関係を解決します。依存関係は、DependencyAttributeでマークされた読み取り/書き込みプロパティとして実装されます。

ここUnityControlは次のようになります。

public abstract class UnityControl : Control 
{ 
    protected UnityControl() : base() 
    { 
     Container = ServiceLocator.Current.GetInstance<IUnityContainer>(); 
     Container.BuildUp(this.GetType(), this); 
    } 

    protected IUnityContainer Container { get; private set; } 
}