2013-06-13 74 views
2

我有一個基類和一個派生類,我想導出從派生類型。MEF導出派生類和新實例

所以這樣

public class ClassA { } 
public class ClassB : ClassA { } 

我需要加載從ClassB的來源於ClassA的派生類型,但也類型。

var registration = new RegistrationBuilder(); 

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

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

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(".", registration)); 
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly(), registration)); 

container = new CompositionContainer(catalog); 
container.SatisfyImportsOnce(this, registration); 

我認爲問題是,當出口ClassA派生類型,還出口ClassB類型是顯而易見的,就是我要尋找的功能。但這意味着ClassB導入不是作爲獨立對象導出的,而是與導入爲ClassA類型的導入相同。如果我沒有專門導出ClassB,那麼使用它們的任何導入都會失敗。

我可能會試圖做一些愚蠢的嘗試和解決我的問題在這裏,MEF不喜歡?我曾考慮過讓MEF進口非單一進口,但這可能會破壞進口產品。

+0

你得到的錯誤信息是什麼?請注意,RegistrationBuilder.ForTypesDerivedFrom將不包含指定的類型,僅包含其派生類。 –

回答

3

在給出的例子中,只有ClassB(帶有classA的導出定義)被導出爲MEF部分。正如Panos已經提到的那樣,ForTypesDerivedFrom不會導出基類。

你可以做這樣的事情:

var registration = new RegistrationBuilder(); 
registration.ForTypesDerivedFrom<ClassA>().Export(); 
registration.ForType<ClassA>().Export(); 

這將出口ClassA的所有派生類(ClassB的也有ClassB的合同,而不是與ClassA的),並分別ClassA的。 此外,如果您想要隱藏基本部分,但仍希望在此類中使用導入,則可以將[PartNotDiscoverable]屬性添加到您的基類。