更新: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
{
}
ありがとうございます。私はFoo/Barのctorパラメータを削除しました。同じ例外がスローされます。 –
これはオプションではないので、idにはプロパティインジェクションを使用するのが奇妙に見えます。あなたはそのようなシナリオはスイートDIパターンではないと思いますか?それはMEFだけの問題ですか?私は他のDIコンテナを使用すべきですか、それともDIのための間違った抽象レベルですか? –
誰もこのコードスニペットを試しましたか?私は例外をスローする唯一の人ですか? –