2010-12-06 14 views
5

İlk projemi MEF ile yapıyorum ve tembel yüklemeyi nasıl kullanacağımı ciddi olarak anlayamıyorum. Benim kodudur -Lazy Yükleme DLL'leri MEF ile

public static class MefLoader 
{ 
    private static CompositionContainer Container; 

    [ImportMany(typeof(IControlModule), AllowRecomposition = true)] 
    private static IEnumerable<Lazy<IControlModule, IImportComponentCapabilites>> 
       DllList { get; set; } 

    static MefLoader() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new DirectoryCatalog(".")); 
     Container = new CompositionContainer(catalog); 

    } 

ben DllList nesneyi başlatmak için nasıl görmüyorum dışında MEF nasıl kullanılacağı en anlıyoruz. Tembel yüklemeyi kullanmak istiyorum çünkü son sistemde çok fazla seçeneğimiz var ve sadece% 10'u herhangi bir zamanda kullanılacak.

cevap

6

İlk olarak, statik bir özellik haline nesneleri almak için çalışıyoruz. Bu, MEF tarafından desteklenmez: MEF nesnelerini sınıfları sınıflarını değil. Eğer statik özelliklerini başlatmak istiyorsanız, böyle elle yapmak zorunda:

DllList = container.GetExports<IControlModule, IImportComponentCapabilites>(); 

Şimdi tembel yükleme hakkında: DirectoryCatalog dizindeki her montaj için bir AssemblyCatalog yaratır. MEF'deki AssemblyCatalog uygulaması, AssemblyCatalog.Parts çağrılır yapılmaz derleme içerisindeki tüm türleri numaralandırır; bu, kapsayıcıdan bir dışa aktarma işlemi gerçekleştirdiğinizde gerçekleşir. Bu, MEF'in gerçekten ihtiyaç duyduğu bir parça içerdiğini belirlemeden önce bile meclisin yüklendiği anlamına gelir.

Tembel yükleme düzeneklerine gerçekten sahip olmak için, bu parçalarda hangi parçaların bulunabileceğine dair bilgilerin bir yerde önbelleğe alınması gerekir. MEF şu anda kutudan böyle bir yerleşik önbellek mekanizmasına sahip değildir. Bununla birlikte, MEF source code at codeplex ile birlikte verilen örneklerde ComposablePartCatalogAssemblyCache uygulaması vardır.

Lazy<T>'un yapması gereken tek şey, parçanın yapıcısının yapısının çağrıldığı anı erteler. Bu zaten işleri hızlandırabilir, ancak meclislerin yüklenmesini ertelemez.

1

MEF hakkında çok şey nesneyi başlatmak yok (varsayılan olarak) olduğu; MEF, ithalatınızı karşılayan bildirilen [Dışa Aktar] 'ı eşleştirecek ve daha sonra sizin için MEF olacaktır. Bağımlılıklarınızın bağımlılıkları varsa, MEF tüm grafiğiniz çözülene kadar zinciri aşmaya devam edecektir.

Tembel'i kullanmak (T'nin tersine), yalnızca bu bağımlılığa erişene kadar örneklemenin erteleneceği anlamına gelir. Belki de hata ayıklama yapıyorsanız ve bu bağımlılığın ne zaman başlatıldığını göremiyorsanız, örneklemeyi başlatmak için Value özelliğine erişmeniz gerekir.

MEF ve diğer birçok IoC kapsayıcısı arasında bazı büyük farklılıklar vardır (MEF yalnızca genişletilebilirlik/kompozisyona odaklanmıştır), ancak bir IoC kabının, bir tür kaydedildikten sonra nasıl bir bağımlılık oluşturacağına benzer bir şeyi çözersin.

Eğer örnekleme davranışının bazı nasıl değiştirebileceğinizi merak ediyorsanız

, burada oluşturma politikaları hakkında bazı detay daha var: http://mef.codeplex.com/wikipage?title=Parts%20Lifetime

0

Bu gerçekten eski bir sorudur, ancak bir çözüm arayan herkes için, yakın zamanda bu eklentileri yüklemek zorunda kalmadan eklenti meta verilerini hazırlarken eklenti derlemelerinin tembel yüklenmesini sağlayan bir LazyAssemblyCatalog uygulamıştım. Onun konsepti, @Wim'in cevabında bahsettiği CachedAssemblyCatalog'a çok benzer. Umarım bu, kimseye yardım eder.