2013-07-16 13 views
4

隨着新流利MEF編程模型,如果我有多個目錄:什麼時候將RegistrationBuilder傳遞給目錄?

  1. 做我通過哪個目錄我RegistrationBuilder到???
  2. 我需要通過RegistrationBuilder撥打SatisfyImportsOnce嗎?
  3. 我使用SatisfyImportsOnceComposeParts中的哪一個? (在流利的mef有什麼變化?)

E.g.下面是我的llustrate混亂(見的r.h.s評論)一個例子:

// Get pre-wired registration builder 
RegistrationBuilder rb = new MefCompositionRoot().CommonRegistrationBuilder(); 

// Register this WCF service class 
rb.ForType<LogService>().Export<LogService>(); 


var assembly = typeof (LogService).Assembly; 
var assemblyCatalog = new AssemblyCatalog(assembly, rb); // <-- HERE? 
var dirCatalog = new DirectoryCatalog("bin", rb); // <-- and HERE? 

// Combine catalogs 
var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(dirCatalog); 
catalog.Catalogs.Add(assemblyCatalog); 

var container = new CompositionContainer(catalog); 

container.SatisfyImportsOnce(this, rb);// THIS? 
container.ComposeParsts(this); ///or THIS? 

回答

1
  1. 你可以把RegistrationBuilder任何您想要使用與MEF約定的目錄。如果您只想使用約定模型,則在所有目錄中使用它。如果示例代碼中的DirectoryCatalog將加載只包含Attributed導出/導入的程序集,則不需要RegistrationBuilder。請注意,這兩種模式(歸因和爭用)可以共存。因此,您可以將RegistrationBuilder添加到所有目錄,除非可能存在滿足使用而不是要在CompositionContainer中使用的規則(使用RegistrationBuilder配置)的類型。
  2. SatisfyImportsOnce這個超負荷是一個謎。從文檔(以及快速瀏覽MEF的源代碼)看來,您可以使用特定的RegistrationBuilder ad-hoc。實際上,我只是設法將它與隨後的代碼示例一起使用。
  3. SatisfyImportsOnce禁用重新組合。看看這個主題excellent answer

樣品使用SatisfyImportsOnce(對象,ReflectionContext)

private static void TestLateRegistration_SameBuilder_Ok() 
{    
    var rb = new RegistrationBuilder();    
    var assemblyCatalog = new AssemblyCatalog(typeof(LogService).Assembly, rb); 

    using (var container = new CompositionContainer(assemblyCatalog)) 
    {     
     rb.ForType<LogService>().Export(); 
     var server = new TypeImportingLogService(); 
     //Use the same RegistrationBuilder. 
     container.SatisfyImportsOnce(server, rb); 
    } 
} 
相關問題