2012-01-04 10 views
4

まず、あなたはすべて素晴らしいです。私はこのサイトでMEFの回答を探しています。MEF Importing null

私の問題は、以下の通りである。

私はそれらの多くの[インポート]を有するいくつかのアセンブリおよび組立が行われる一つのメインのアプリケーションを持っています。今問題は、それらの輸入が常に満たされていないということです。

単純な小さなプロジェクトでこの動作を再現しようとしましたが、次のソースコードがありました。

私はMEFについていくつか迷っていますか?

助けてください!皆さん、ありがとうございました!

アセンブリインターフェース:

namespace Interfaces 
{ 
    public interface IClass1 
    { 
     void Trigger(); 
    } 

    public interface IClass2 
    { 
     void Trigger(); 
    } 

    public interface IClass3 
    { 
     void Trigger(); 
    } 
} 

アセンブリライブラリ1:

namespace Library1 
{ 
    [Export(typeof(IClass1))] 
    public class Class1:IClass1 
    { 

     #region IClass1 Members 

     public void Trigger() 
     { 

     } 

     #endregion 
    } 
} 

アセンブリLibrary2:

:私は次の操作を行って、全体MEFのものを組み立てるメインプログラムの開発に

namespace Library2 
{ 
    [Export(typeof(IClass2))] 
    public class Class2:IClass2 
    { 
     [Import] 
     public IClass1 Class1 { get; set; } 

     public void Trigger() 
     { 
     } 
    } 
} 

しかし、以下のクラスが満たされた輸入品のいずれかを持っていないことをした後:私は容器の中に探していたとき

namespace MEFTest 
{ 
    public class Class3:IClass3 
    { 
     [Import] 
     public IClass1 Class1 { get; set; } 

     [Import] 
     public IClass2 Class2 { get; set; } 

     public void Trigger() 
     { 
      Class1.Trigger(); 
      Class2.Trigger(); 
     } 
    } 
} 

、私はIClass1とICLass2が構成されていたことがわかります。

[インポート]がClass3で満たされていないのはなぜですか?私は何かが完全に欠けていると思います...

ありがとうございました!

限りClass3には、あなたが任意のインポートは表示されませんMEFによってインスタンス化されていないとして、マイケル

答えて

3

btw [ImportingConstructor]を経由せずにインポートを行う場合は、使用する前に満足している(IPartImportsSatisfiedNotification)ことを確認してください。

これは動作しますが、私はあなたが必要な場所あなたのClass3の

public class mefStart 
{ 
    [Import] 
    private IClass3 my3; 
    public CompositionContainer Container { get; private set; } 

    public void Start() 
    { 
     AggregateCatalog catalog = new AggregateCatalog(); 

     AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly); 
     DirectoryCatalog directoryCatalog = new DirectoryCatalog(".", "Library*.dll"); 
     catalog.Catalogs.Add(directoryCatalog); 
     catalog.Catalogs.Add(assemblyCatalog); 

     this.Container = new CompositionContainer(catalog); 

     CompositionBatch batch = new CompositionBatch(); 
     batch.AddExportedValue(this.Container); 

     this.Container.Compose(batch); 
     this.Container.ComposeParts(this); 

     //from here you can use Class3 with all imports 
    } 
} 

[Export(typeof(IClass3)] 
public class Class3:IClass3 
{ 
    [Import] 
    public IClass1 Class1 { get; set; } 

    [Import] 
    public IClass2 Class2 { get; set; } 

    public void Trigger() 
    { 
     Class1.Trigger(); 
     Class2.Trigger(); 
    } 
} 
+0

ああのOKを知らない - 右 - そう私はSatisfyImportsOnceを使用する必要がありますでしょうか? – Michael

+0

なぜあなたはclass3をexportとして宣言せず、MEFにclass3インスタンスを作成させますか?あなたがclass3にCompositionContainerインスタンスが必要なのを望んでいないのですが、私はあなたが欲しいと思うことはしません。 – blindmeis

+0

OK - クラス3のインスタンスを保持するにはどうすればいいですか? – Michael