2017-12-18 11 views
0

私はいくつか再利用可能なUserControlを持っています。それらのUserControlsの中に、私はbootstrapperの中に登録したサービスインスタンスにアクセスします。Prism WPF - UserControlsまたはカスタムコントロール内のServiceLocatorにアクセスする方法

これらのユーザーコントロールがxamlの内部で直接使用されているため、コンストラクタインジェクションを実行できません。したがって、ServiceLocator.Currentにアクセスしようとしましたが、例外がスローされました。

したがって、WPFはxamlの中でそれらをロードするパラメータのないコンストラクタを必要とするため、コンストラクタインジェクションを実行できないユーザーコントロール内の登録済みサービスインスタンスにアクセスするためのベストプラクティスは何ですか?

(ところで、私はUnityBootstrapperを使用しています)

+0

「これらのUserControl内部を」コードビハインドで意味?何が(自動配線された)ビューモデル(istコンストラクタにすべてが注入されている)を使用できないのですか? – Haukinger

+0

あなたのUserControlはどこにありますか?シェルウィンドウでは? – mm8

+0

@Haukinger、 "auto-wired viewmodelを使用し、コンストラクタインジェクションを使用する"というのは私の欠点です。つまり、私が他の解決策を見つけることができなければ、私はそのように行くでしょう。そして、私はどのようにすべてのプリズムの人々がこの種の仕事をしているのだろうと思っています。 –

答えて

0

あなたはDependencyPropertyにIUnityContainerを作成することができますし、XAMLでそれをあなたのコントロールのインスタンスを与える:

<local:MyControl UnityContainer="{Binding Container}"/> 

今、あなたはMyControlと内側にアクセスすることができます。これはできますか?

私のチームはコンテナの静的リファレンスを使用したいと考えていますが、コンバーター内でのみ使用することができます。おそらく、あなたは、この場合には、あまりにもことを使用することができます。

<local:MyControl UnityContainer="{UnityContainer}"/> 

これは、このオプションを動作させるために必要なものです:

public static class MarkupExtensionHost 
{ 
    public static IUnityContainer Container { get; set; } 
} 

public class UnityContainerExtension : MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return MarkupExtensionHost.Container; 
    } 
} 
+0

したがって、2番目のオプション(静的参照)はServiceLocator.Currentの使用と同じです。しかし、それは動作しません。なぜ私は不思議です。 –

+0

ilspyは、ServiceLocator.CurrentがServiceLocator.currentProviderを返すことを示します。このServiceLocator.currentProviderは、SetLocatorProviderメソッドで設定されます。おそらく、このメソッドを.Currentを使用する前に設定することが期待されますか? (ServiceLocator.SetLocatorProvider) – Milan

+0

UnityBootstrapperはすでにServicelocator.Currentを設定しています。そして私はすでにビューモデルの中でそれを使うことができます。しかし、カスタムユーザーコントロールについては、私はServicelocator.Currentインスタンスを取得できません。 –

関連する問題