2017-05-07 14 views
2

を使用して、プロパティは、私たちが次のシナリオを考えてみましょう:輸出は、MEF

class Master 
{ 
    private Person selectedPerson; 

    public Person SelectedPerson 
    { 
     get 
     { 
      return selectedPerson; 
     } 
     set 
     { 
      selectedPerson = value; 

     } 
    } 

} 

[Export(typeof(Details))] 
class Details 
{ 
    [ImportingConstructor] 
    public Details(Person person) 
    { 

    } 
} 

は、私は、引数としてSelectedPersonと詳細のインスタンスを初期化する必要があります。ですから、基本的には、Personの特定のインスタンスをDetailsコンストラクタに挿入する必要があります。

MEFを使ってどうすればいいですか?

+0

を拡張する必要がありますそのサービスを詳細クラスにインポートします。その後、personオブジェクトから利用可能な情報を使用して、サービスから正しい詳細をロードできます。 var contactDetail = contactDetailService.Load(person.Id); –

答えて

1

簡単な答え:あなたが注入したいPersonをエクスポートする必要があります。 ImportingConstructor属性はクラスだけ一度使用することが許可されていることを

public class Program 
{ 
    [Export(typeof(Person))] 
    private Person personToInject { get; set; } 

    public static void Main(string[] args) 
    { 
     new Program().Run(); 
    } 

    private void Run() 
    { 
     var catalog = new DirectoryCatalog("."); 
     var container = new CompositionContainer(catalog); 

     //Create the person to inject before composing 
     personToInject = new Person();   

     container.ComposeParts(this); 
    } 
} 

注:ここでの可能なコンソールアプリケーションの基本的な例があります。

ソリューションを改善するには、名前を使用して注入するプロパティを識別する必要があります。したがって、私はそれがMEFで可能な、あなたは人の詳細をロードすることができ、サービスを作成しなければならないと信じてはいけない、あなたのコンストラクタのプロトタイプ

[ImportingConstructor] 
public Details([Import("personParameter")]Person person) 

およびエクスポート

[Export("personParameter")] 
private Person personToInject { get; set; } 
+0

ありがとうございます。それはまさに私が探していたものでした。 –

+0

うれしいことに私は助けてくれました - 幸せなコーディング:-) – Fruchtzwerg