2012-09-10 11 views
5

更新:DIコンテナで処理するか、間違った抽象化レベルですか?MEFと抽象ファクトリ

MEF(.NET 4.5)を使用してABSTRACT FACTORYを実装したいと考えています。

それは私のために動作しません...

構図は変わりません。次のエラーのために変更が拒否されました:

この構成では、単一の構成エラーが発生しました。根本原因は以下のとおりです。詳細については、CompositionException.Errorsプロパティを確認してください。

ContractName Mef3.Factoryに結果の

RequiredTypeIdentity Mef3.Factory :

1)いいえ、輸出が制約に一致する見つかりませんでしたが、インポート「Mef3.Program._factory(ContractName = "MEF3設定できません。工場 ") 'を' Mef3.Program 'に追加しました。

要素:Mef3.Program._factory(ContractName = "Mef3.Factory") - > Mef3.Program

それはMEFでそれを行うための正しい方法ですか? idをFoo/Bar ctorsに転送するにはどうすればよいですか?

コード:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var program = new Program(); 
     program.Run(); 
    } 

    readonly CompositionContainer _container; 

    public Program() 
    { 
     var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
     _container = new CompositionContainer(catalog); 
     _container.ComposeParts(this); 
    } 

    [Import] 
    public Factory _factory; 

    public void Run() 
    { 
     var foo = _factory.GetInstance("foo", 123); 
     Console.WriteLine(foo is Foo); 
    } 
} 

[Export] 
public class Factory 
{ 
    private readonly ExportFactory<Foo> _fooFactory; 
    private readonly ExportFactory<Bar> _barFactory; 

    [ImportingConstructor] 
    public Factory(ExportFactory<Foo> fooFactory, ExportFactory<Bar> barFactory) 
    { 
     _fooFactory = fooFactory; 
     _barFactory = barFactory; 
    } 

    public Base GetInstance(string name, int id) 
    { 
     switch (name) 
     { 
      case "foo": 
       return _fooFactory.CreateExport().Value; 

      case "bar": 
       return _barFactory.CreateExport().Value; 
     } 

     throw new ArgumentException(); 
    } 
} 

public class Foo : Base 
{ 
    [ImportingConstructor] 
    public Foo([Import("Id")] int id) 
    { 
    } 
} 

public class Bar : Base 
{ 
    [ImportingConstructor] 
    public Bar([Import("Id")] int id) 
    { 
    } 
} 

[InheritedExport] 
public abstract class Base 
{ 
} 

答えて

1

問題はfooとbarにあなたの[インポート( "ID")]によって引き起こされることになりそうです。契約名が「Id」のエクスポートはありません。 MEFでは、一般的に、実行時にインポートを渡すことはできません。合成時にグラフ全体を満足させる必要がある場合は、動作しません。この特定のシナリオを達成するためにMEFを使用する場合は、FooとBarのImportingConstructorを削除し、SetIdメソッドをBaseクラスに追加して、GetInstanceを呼び出すときにファクトリで呼び出す必要があります。

+0

ありがとうございます。私はFoo/Barのctorパラメータを削除しました。同じ例外がスローされます。 –

+0

これはオプションではないので、idにはプロパティインジェクションを使用するのが奇妙に見えます。あなたはそのようなシナリオはスイートDIパターンではないと思いますか?それはMEFだけの問題ですか?私は他のDIコンテナを使用すべきですか、それともDIのための間違った抽象レベルですか? –

+0

誰もこのコードスニペットを試しましたか?私は例外をスローする唯一の人ですか? –

関連する問題