MEF

2011-04-04 9 views
6

kullanarak var olan bir nesne için ithalatı yerine getirme [İçe Aktar] etiketleriyle ilişkilendirilmiş halihazırda mevcut olan bir nesne verildiğinde, MEF'in ithalatı doldurması için yapmam gereken tef dansı nedir?MEF

Blog belgelerinin çoğu, MEF'nin önizleme sürümlerine göre oluşturulmuş ve artık çalışmıyor - .NET 4.0'ın bir parçası olan (veya alternatif olarak, MEF 2.0 Preview 3) yayımlanmış olanını kullanıyorum.

AggregateCatalog _catalog; 
CompositionContainer _container; 

public void Composify(object existingObjectWithImportTags) 
{ 
    lock(_container) { 
     var batch = new CompositionBatch(); 

     // What do I do now?!?! 
    } 
} 
+0

ilk denemede tefsiyi nasıl heceleyeceğinizi biliyor olsaydınız – toddmo

cevap

6

MEF (geçerli montaj dahil) katalogda kayıtlı kayıtlı meclislerinde türlerini ihraç itibaren kendi bağımlılıkları nereye boyunca (mülkiyet veya yapıcı enjeksiyon yoluyla) İthalat, giderir. Eğer (new anahtar kelimeyi kullanarak) doğrudan bir nesne oluşturmak istiyorsanız

veya ihracat oluşturma sırasında hazır değildi durumda, bir ithalatı tatmin için kap kullanabilirsiniz nesne, kullanarak:

_container.SatisfyImportsOnce(yourObject); 

Sadece bunu yaparak küçük bir senaryoyu bir araya getirdim. Burada kod:

public class Demo 
{ 
    private readonly CompositionContainer _container; 

    [Import] 
    public IInterface Dependency { get; set; } 

    public Demo(CompositionContainer container) 
    { 
     _container = container; 
    } 

    public void Test() 
    { 

     //no exported value, so the next line would cause an excaption 
     //var value=_container.GetExportedValue<IInterface>(); 

     var myClass = new MyClass(_container); 

     //exporting the needed dependency 
     myClass.Export(); 

     _container.SatisfyImportsOnce(this); 

     //now you can retrieve the type safely since it's been "exported" 
     var newValue = _container.GetExportedValue<IInterface>(); 
    } 
} 

public interface IInterface 
{ 
    string Name { get; set; } 
} 

[Export(typeof(IInterface))] 
public class MyClass:IInterface 
{ 
    private readonly CompositionContainer _container; 

    public MyClass() 
    { 

    } 
    public MyClass(CompositionContainer container) 
    { 
     _container = container; 
    } 

    #region Implementation of IInterface 

    public string Name { get; set; } 

    public void Export() 
    { 
     _container.ComposeExportedValue<IInterface>(new MyClass()); 
    } 

    #endregion 
} 

Şimdi, Demoyu başlatmak için new Tests(new CompositionContainer()).Test(); kullanın. Bu yardımcı olur

Umut :)

+0

Hayır, bu işe yaramaz, SatisfyImportsOnce bir ComposablePart alır - bu benim temel sorunum. –

+0

, ithalatını tatmin edecek herhangi bir nesneyi alan bir aşırı yükleme (veya daha çok bir uzantı yöntemi) var. Buraya koyduğum tam örneği denedim ve çok iyi çalıştı;) – AbdouMoumen

+0

Ah, "System.ComponentModel.Composition kullanarak" ifadesine ihtiyacınız var (sadece .Hosting) - bahşiş için teşekkürler! –

3
_container.ComposeParts(existingObjectWithImportTags); 

ComposeParts Aradığınız bir uzantısı yöntemidir.

Basitçe bir CompositionBatch oluşturur ve AddPart (AttributedModelServices.CreatePart (attributedObject)) öğesini çağırır ve sonra _container.Compose (toplu iş) çağrılarını çağırır.