2010-03-26 26 views
7

MEF kullanıldığında temel bir şey eksik. Her şeyin aynı mecliste olduğu örnekleri ve basit bir konsol uygulamasını kullanarak çalışıyorum. Daha sonra çeşitli varlıkları içeren ayrı bir projeye bazı ithalat ve ihracat yaptım. Bu varlıkları bir MS Testinde kullanmak istiyorum, ancak kompozisyon aslında hiç bitmedi. Kompozisyon malzemelerini söz konusu bir varlığın yapıcısına taşıdığımda işe yarıyor ama bu kesinlikle yanlış. GetExecutingAssembly sadece test sürecini "görüyor" mu? Yeniden kapları ne kaçırıyorum? Konteyneri bir testte kullanma şansını denemeye çalıştım. MEF docs hala çok yetersiz ve farklı bir projeden varlıklarını kullanan bir uygulamanın (veya MS Testinin) basit bir örneğini bulamıyorum ...MEF diğer montajlardaki parçaları bulamıyor

cevap

9

.NET'te, her bir exe veya DLL dosyasına derleme adı verilir. Bu nedenle, "yürütme işlemini" temel alan bir katalog oluşturduğunuzda ve uygulama giriş noktasında kullandığınızda, yalnızca exe projesinde tanımlanan parçaları da dahil edersiniz. DLL'lerde tanımlı herhangi bir parça almazsınız.

deneyin değiştirerek bu: bundan

var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 

:

var catalog = new AggregateCatalog(
    new ComposablePartCatalog[] 
    { 
     new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
     new DirectoryCatalog(".") 
    }); 

düzenleme: Sadece basit bir çözüm olduğunu keşfetti:

var catalog = new DirectoryCatalog(".", "*"); 

() Aslında, bir montaj birden çok dosyadan oluşabilir, ancak bu nadiren kullanılır. Terim ayrıca yan yana COM için kullanılır.

3

Evet. Kompozisyondan önce kataloğunuza (ithalat ve ihracatla birlikte) montajınızı eklediğinizden emin olmalısınız. Bu şekilde uygun parçaları bulabilir.

GetExecutingAssembly tam olarak söylediği şeyi yapar - şu anda çalıştırılan derlemeyi alır, yani bu, söz konusu kodun yazılı olduğu anlamına gelir. Sizin durumunuzda, bu test kütüphanesi değil, "kütüphane" projenizdir.

Sınamanızı kitaplık projesini kataloğa açıkça ekleyin ve büyük olasılıkla beklediğiniz gibi çalışacaktır.