2013-12-08 9 views
6

tüm ihracat aynı sözleşme türüne sahip iki ihracatını var ama farklı sözleşme adıylaServis Bulucu:</p> <pre><code>[Export("TypeA", typeof(MyPlugin))] [Export("TypeB", typeof(MyPlugin))] </code></pre> <p>kullanıyorum her ihracatını geri alabilirsem: Ben <em>MEF</em> ve ben kullanıyorum

Ör alın kendi ilgili sözleşme adı:

ServiceLocator.GetExportedValues<MyPlugin>("TypeA"); 

Ama şimdi MyPlugin uygulayan tüm örneklerini almak istiyoruz. Yapabileceğim herhangi bir yol var mı? Aşağıdaki kodu kullanarak denedim

:

ServiceLocator.GetExportedValues<MyPlugin>(); 

Ama işe yaramadı. Görünüşe göre, yalnızca belirli bir sözleşme adı olmayan uygulamaları almak için kullanılır.

Herhangi bir fikir?

cevap

4

den fazla bilgileri alabilirsiniz. Örneğin

// named and nameless 
[Export("TypeA", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

// named nameless, again 
[Export("TypeB", typeof(MyPlugin))] 
[Export(typeof(MyPlugin))] 

class MyPlugin { } 


[TestMethod] 
public void mef() 
{ 
    var catalog = new AssemblyCatalog(this.GetType().Assembly); 
    var container = new CompositionContainer(catalog); 

    Assert.AreEqual(2, container.GetExportedValues<MyPlugin>().Count()); 
} 
0

Güçlü yazılan Meta veri dışa aktarmayı kullanabilirsiniz.

  1. Arabirimden gelen ExportAttribute öğesinden devralınan özel bir öznitelik oluşturun.
  2. Dışa aktarma yerine bu özel niteliği kullanın.

İstenen türü almak için Aktarımı kullanabilirsiniz.

[ImportMany] 
public IEnumerable<Lazy<YourType,IMetadataAttribute>> Plugins{get;private set;} 

Sen hem yolları çözülebilir olmak istiyorsanız ben sadece her adlandırılmış ihracat yanında isimsiz ihracatını eklersiniz MEF Documentation

0

Export

[Export(typeof(IFoo)),Export("TypeA", typeof(IFoo))] 
public class Foo1 : IFoo { } 

[Export(typeof(IFoo)),Export("TypeB", typeof(IFoo))] 
public class Foo2 : IFoo { } 

her iki tür beyan Ve bu @ default.kramer en daha farklı cevap nasıl ImportMany

[ImportMany] 
IFoo[] foos; 
+1

kullanarak bunları ithal? –

+0

Beyanname aynıdır, ancak Mef'in tüm örnekleri doğrudan kapsayıcıya/kataloğa başvurmak zorunda kalmadan nasıl enjekte edebildiğinizi de gösteriyorum. Bu, DI çerçevesinin nasıl kullanılması gerektiğine dair uygun bir yöntemdir. –

İlgili konular