2012-09-10 25 views
5

GÜNCELLEŞTIRME: DI kapsayıcısıyla işlemeye çalışmalı mıyım yoksa yanlış bir soyutlama seviyesi mi olmalıyım?MEF ve FABRİKA FABRİKASI

ABSTRACT FACTORY uygulamasını MEF (.NET 4.5) kullanarak uygulamak istiyorum.

Benim için çalışmıyor ...

kompozisyon değişmeden kalır. Değişiklikler aşağıdaki hatalar nedeniyle reddedildi:

Kompozisyon, tek bir kompozisyon hatası oluşturdu. Kök neden aşağıda verilmiştir. Daha ayrıntılı bilgi için CompositionException.Errors özelliğini gözden geçirin.

ContractName Mef3.Factory sonuçlanan

RequiredTypeIdentity Mef3.Factory :

1) Hayır ihracat kısıtlamasını eşleşen bulundu ithalat 'Mef3.Program._factory (ContractName = "Mef3 ayarlanamaz. "Mef3.Program" bölümündeki fabrika ").

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

o MEF bunu yapmak için doğru yolu var mı? Kimlik numarasını Foo/Bar ctors'a nasıl iletebilirim?

kodu:

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 
{ 
} 

cevap

1

konu Foo ve Bar üzerinde [İthalat ("Id")] kaynaklanabilir gözüküyor. "Id" sözleşme adında bir ihracat yok. MEF genel olarak çalışma zamanında içe aktarma yapmanıza izin vermez, kompozisyonun tamamında grafiğin tamamını karşılayabilmeniz veya işe yaramayacak olmanız gerekir. Bu senaryoyu gerçekleştirmek için MEF'yi kullanmak isterseniz, ImportingConstructor'ı Foo ve Bar'da kaldırmalı ve Base sınıfında bir SetId yöntemi eklemeli ve GetInstance'ı çağırdığınızda fabrikanızı aramalısınız.

+0

Teşekkür ederiz. Foo/Bar ctor parametrelerini kaldırdım. Aynı istisnayı atar. –

+0

İsteğe bağlı olmadığı için kimlik için özellik enjeksiyonu kullanmak garip görünüyor. Böyle bir senaryonun DI desene uygun olmadığını düşünüyor musunuz? MEF sadece sorun mu? Diğer DI kapsayıcısını mı kullanmalıyım yoksa DI için yanlış bir soyutlama seviyesi mi? –

+0

Bu kod pasajını deneyen var mı? Ben istisna atar tek kişi ben miyim? –