2010-12-14 12 views
1

私が理解しているように、インポート/エクスポートの属性が正しく接続されるためには、これらの属性を持つ新しいインスタンスごとにcompositionContainerInstance.Compose(...)を呼び出す必要があります。MEF - インスタンスを作成し、MEF内にインスタンスを自動的に作成できますか?

これは自動的に起こる可能性があるので、いくつかの構成可能なクラスの新しいインスタンスを作成するたびに行う必要はありません。

これは例ですが、長いことながら、私が持っている問題を抽象化しています。

public class Worker1 
{ 
    [Import(typeof(IDataProvider))] 
    public IDataProvider DataProvider; 

    public Worker2 second; 
    //use data provider to perform logic 
} 

public class Worker2 
{ 
    [Import(typeof(IDataProvider))] 
    public IDataProvider DataProvider; 

    //use data provider to perform logic 
} 

[Export(typeof(IDataProvider))] 
public class GeoDataProvider : IDataProvider 
{ 
    //implements logic 
} 

public class Container 
{ 
    private Worker1 t1; 
    public void Init() 
    { 
     AggregateCatalog cat = new AggregateCatalog(); 
     cat.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     cat.Catalogs.Add(new DirectoryCatalog(".")); 

     CompositionContainer c = new CompositionContainer(cat); 
     c.ComposeParts(new GeoDataProvider(), this); 
    } 

    public void PerformLogic() 
    { 
     t1 = new Worker1; 
     //here it fails because I need c.ComposeParts(t1): 
     t1.DoSomethingWithProvider(); 
     //but even if I do c.ComposeParts(t1), still the t1.second.DataProvider will be null 
     //how to avoid this? 
    } 
} 

私は何のために望んでいることは、自由に、彼らは、使用前に構成する必要があることを知らなくてもWorker1/Worker2の新しいインスタンスを作成する方法です。それは実現可能ですか?

答えて

4

誰かが作成する必要があることを知っている必要があります。

MEFで作成するのではなく、Worker1インスタンスとWork2インスタンスを自由に作成する場合は、MEFに新しいインスタンスのインポートを満たすチャンスを与えなければなりません。IDataProviderフィールドは決して決してありません記入。

ここでは、必要に応じてMEFにクラスを作成させる例を示します。すべての設定を取得するには、「ComposeParts」コールが1つだけ必要です。

[Export] 
public class Worker1 
{ 
    [Import] 
    public IDataProvider DataProvider; 

    [Import] 
    public Worker2 second; 

    //use data provider to perform logic 
    public void DoSomethingWithProvider() { 
    } 
} 

[Export] 
public class Worker2 
{ 
    [Import] 
    public IDataProvider DataProvider; 

    //use data provider to perform logic 
} 

[Export(typeof(IDataProvider))] 
public class GeoDataProvider : IDataProvider 
{ 
    //implements logic 
} 

public class Container 
{ 
    [Import] 
    private Worker1 t1; 

    public void Init() 
    { 
    AggregateCatalog cat = new AggregateCatalog(); 
    cat.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
    cat.Catalogs.Add(new DirectoryCatalog(".")); 

    CompositionContainer c = new CompositionContainer(cat); 
    c.ComposeParts(this); 
    } 

    public void PerformLogic() 
    { 
    t1.DoSomethingWithProvider(); 
    } 
} 
+0

ありがとう、これは本当に素晴らしい答えです。残念なことに私の労働者の一部は実際にはUserControls(デザイナーによってインスタンス化されている)なので、そのようなインスタンスをComposeするために入れ子になったコントロールのそれぞれにロジックを追加する必要があります。再度、感謝します!私は本当に今このMEFを理解するようになっています:) – veljkoz

関連する問題