سؤال

أنا ألعب مع الجديد System.ComponentModel.Composition مساحة الاسم في .NET 4.0 beta 2، والمعروفة أيضًا باسم إطار التوسعة المدارة.

أستخدم مثال C# التالي حيث a Monkey الواردات أ Banana:

public interface IBanana 
{ 
}

[Export(typeof(IBanana))]
public class Banana : IBanana 
{ 
} 

public class Monkey
{
    [Import(typeof(IBanana))]
    public IBanana Banana { get; set; }
}

ومع ذلك، عندما أحاول تكوين القرد على النحو التالي، أحصل على InvalidOperationException مع الرسالة "لم تتم تهيئة هذا الكائن - يجب تعيين الخاصية "SourceProvider".":

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana)));
var container = new CompositionContainer(exportProvider);
var monkey = new Monkey();
container.ComposeParts(monkey);

ما الذي أفتقده هنا؟أدرك أنه يمكنني تمرير الكتالوج مباشرة دون تغليفه في CatelogExportProvider، ولكن ألا يجب أن يعمل ما ورد أعلاه أيضًا؟

هل كانت مفيدة؟

المحلول

يحتاج CatalogExportProvider إلى مرجع إلى الحاوية.يجب أن يعمل الكود التالي:

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana)));
var container = new CompositionContainer(exportProvider);
exportProvider.SourceProvider = container;
var monkey = new Monkey();
container.ComposeParts(monkey);

تقوم الحاوية بذلك تلقائيًا عندما تقوم بتمرير كتالوج إلى المُنشئ.لا أعتقد أن هناك غالبًا سببًا كبيرًا لإنشاء CatalogExportProvider يدويًا.

السبب وراء حاجة CatalogExportProvider إلى مرجع للحاوية هو أنه قد تكون هناك أجزاء في الكتالوج تحتوي على عمليات استيراد يجب استيفاءها من قبل موفري التصدير الآخرين الذين تم توصيل الحاوية بهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top