2016-04-01 27 views
1

私はPrism 6 UWPアプリケーションを開発しようとしています。 私の現在の問題は、アプリケーションで使用されているすべてのオブジェクトをUnity依存性注入コンテナに登録したいということです。 しかし、多くのUIオブジェクトはインフラストラクチャ(Activator.CreateInstance(type))によって作成され、依存性注入conatiner.Iを使用して作成をトリガーする方法は作成されたオブジェクトをDI conatinerで登録しても問題ありません。 私はGithubサンプルアプリケーションAdventureWorks.ShopperをPrismサンプルで使用しました。 ここで私はインフラストラクチャによって作成されたビューを見ましたが、他のオブジェクトはDependency injection conatinerによって作成されています。UWPのUnityコンテナの使用

アプリケーション内のすべてのオブジェクトを取得し、それらをDIコンビネーションに登録する方法はありますか?

アプリケーション内のすべてのオブジェクトを取得し、それらをDIコンテナに登録する方法や、DIコンチナですべての作成をトリガする方法はありますか? あなたはこのように統一コンテナにアクセスすることができます: - - :私たちが見つけ

+0

あなたが反映できる依存関係コンテナを介してオブジェクトのセットを登録しようとしていますか?ロードされたアセンブリの型を反映し、インスタンス化メソッドがActivator.CreateInstanceであるDIコンテナにロードできますか? – QiMata

+0

私はそうすると、私は重複オブジェクトを取得します。いくつかのUIオブジェクトはフレームワークによって表示されます。実際のUIはこのオブジェクトで表示されます。私のDIコンテナは同じクラスの別のインスタンスを持っています –

+0

片道、このようにunityContainer =(UnityContainer)((Prism.Unity.Windows.PrismUnityApplication)Application.Current).Container ;. フレームワークによって作成されたオブジェクトは、コンストラクタAPIの例で登録を追加することによって1つに登録できます。 unityContainer.RegisterInstance (this); –

答えて

2

一般に、コンテナによって作成されたUIオブジェクトは作成しないでください。これは、言及したように、XAML解析プロセス(呼び出すインフラストラクチャ)が責任を負い、簡単な方法で取得できないためですその建設プロセスを引き継ぐためのループ。

これはViewModelLocatorをPrismに追加した理由の1つで、ViewModelからすべての依存関係まで、SetDefaultViewModelFactoryメソッドをワイヤリングしてコンテナを使用して、すべてのViewModelの構築を行います。 ViewModelLocatorを使用してViewModelにViewを配線するかぎり、依存関係(およびその依存関係の依存関係など)も表示されます。

MVVMパターンをよく守っている場合は、コンテナを介してUIオブジェクトを構築する必要はほとんどありません。コンテナ。しかし、それはと決して言わないでください。はそれをする必要があります。あなたがそれを行う必要があるそれらの状況のた​​めにあなたは、いくつかの鋳造でS Vasudevによって提案されたApplication.Currentを通してコンテナに行くことができます。または、そのような場所をいくつか作成し、コード内に「雑音」を入れたくない場合は、AppクラスのOnInitializeAsyncメソッドで設定できる静的プロパティを持つ簡単なヘルパーオブジェクトを作成します。どこにでもアクセスできます。

いくつかの場所でそれをやっているなら、あなたのデザインに疑問を抱かせるべきです。そして、はい静的(グローバル)は悪いので、可能な限り避けるべきです。しかし、いくつかのビューのコードのほんの数箇所であれば、MVVMガイダンスのマイナーな違反を避けるために、MVVMの純粋主義者ではなく、実践的なプログラマーである必要があります。

0

一つの方法
unityContainer =(UnityContainer)((Prism.Unity.Windows.PrismUnityApplication)Application.Current).Container。

Activator.CreateInstanceで作成されたオブジェクトのコンストラクタでは、unityコンテナを使用して、そのインスタンスをunityコンテナに登録できます。

このようにして、すべてのオブジェクトがユニティコンビネータ に登録されます。 - unityContainer.RegisterInstance(this);

関連する問題