2012-11-17 19 views
9

Bunun nasıl yapılacağına dair bir yazı veya bağlantı bulamıyorum ve açık bir problem gibi görünüyor (örneğin kaynak kodunuz yoksa veya MEF için yazılmayan mevcut türleri kullanmak istediğinizde)Dışa aktarma özelliği olmadan MEF'de bir türü nasıl dışa aktarıyorsunuz? (örn. programatik olarak)

container.ComposeExportedValue<MyClass>(myClassInstance); 

gerçekten olsa aradığınız şey muhtemelen yeni kongre: Bunu, konteyner için varolan nesne örneğini eklemek arıyorsanız akılda) içinde

cevap

15

, sen CompositionContainer.ComposeExportedValue yöntemi kullanabilirsiniz Nitelikler yerine isimlendirme kurallarına göre parça oluşturmanıza olanak sağlayan temelleştirilmiş programlama modeli, ancak bu özellik yalnızca .NET 4.5'te kullanılabilir.

Kullanım örneği (bu IController olarak IController uygulayan myAssembly her tür ihraç edecek):

var registration = new RegistrationBuilder(); 

registration.ForTypesDerivedFrom<IController>() 
      .Export<IController>(); 

var catalog = new AssemblyCatalog(myAssembly, registration); 
var container = new CompositionContainer(catalog); 

MEF yeni kongre modelini can be found here nasıl kullanılacağına ilişkin iyi bir örnek.

Bu yardımcı olur umarım. Eğer InheritedExport özelliği olan bir arayüz işaretlerseniz

+0

Mükemmel teşekkürler. Ne yazık ki, bu bir 4.5 özelliği sadece – blue18hutthutt

+0

gibi görünüyor Ben örnek bir önizleme sürümünde dayalı varsayalım? "Implements" yöntemi yoktur, [https://msdn.microsoft.com/en-us/library/system.componentmodel.composition.registration.registrationbuilder.aspx] 'ın bir dizi ForType/ForTypes vardır. yöntemleri. – Stijn

+1

@Stijn Haklısınız, API o zamandan beri değişti - 'ForTypesDerivedFrom'' Implements' yerine geçti. Cevabımı buna göre düzenledim. –

10

, katalog içindeki tüm modülleri onlar İhracat öznitelik veya olmasın işaretlenir olsun, bu arabirim uygulamak, hangi ihraç edilmektedir.

Arayüz:

[InheritedExport] 
public interface IContract { ... } 

Modül:

// No [Export] attribute 
public class ModuleImplementation : IContract { ... } 

Şimdi MEF modülü enjekte edecektir.

İlgili konular