2011-11-08 4 views
1

を使用してオブジェクトをインポートする場合:あなたが見ることができるように設定する非注射パラメータ私は自分のSilverlight 4アプリケーションでは、次のシナリオ持っMEF

public class TheViewModel 
{ 
    [Import()] 
    public TheChild Child { get; set; } 
} 

[Export()] 
public class TheChild 
{ 
    [ImportingConstructor()] 
    public TheChild(String myName, IAmTheService service) { ... } 
} 

[Export(typeof(IAmTheService))] 
public class TheService : IAmTheService 
{ 
    public void DoSomething(String theName); 
} 

を、TheChildのコンストラクタは1つのインポートパラメータと、コンテキストで1つの静的な値が必要です敏感な(親によって提供されなければならない)。文字列の値はAppSettingsや設定などから得られるものではなく、親クラス(この場合はTheViewModel)の現在のインスタンスによってのみ提供されます。経験則として

次のように、私はいつもの依存性注入に近づいてきました:

  1. 必要な依存関係は
  2. オプションの依存関係プロパティインジェクション
によって満たされているコンストラクタ・インジェクションによって成立しています

"myName"パラメータが必要なので、コンストラクタを使用して設定することをお勧めしますが、MEFの仕組みを考えれば、これは変更する必要があるかもしれません。

このシナリオをどのように処理して解決策の背後にあるあなたの考えを教えてもらえますか?

答えて

1

特定の輸入契約を[ImportingConstructor]と組み合わせて指定することができます。たとえば、次のように[Export("MyName")]で飾られた文字列のエクスポートが必要との依存関係を満たすために使用される、ということを考えると

[Export()] 
public class TheChild 
{ 
    [ImportingConstructor()] 
    public TheChild([Import("MyName")] String myName, IAmTheService service) { ... } 

。この場合、[Import]仕様のいずれかが機能するはずです(つまり、サブクラスをタイプ別にインポートする、名前でインポートするなど)。

+0

"myName"に対応するエクスポートはありません。また、その使用率はこの1つの場所でのみ(モジュール性または拡張による)置換の可能性がないため、エクスポートを定義することは過度のようです。 – SonOfPirate

+0

さらに、(TheChildを消費する)アプリケーションのすべてのViewModelに対して、エクスポートを定義する必要があります。あまり実用的ではない。 – SonOfPirate

+1

@SonOfPirate名前でエクスポートする場合は、1回のエクスポートだけが必要です。しかし、これはそれを処理するための仕組みを提供するでしょう。それは、交換の可能性がない場合は、なぜ後にプロパティを介してそれを設定しないと言われていますか? –

関連する問題