我何时将RegistrationBuilder传递给目录?

时间:2013-07-16 15:04:50

标签: c# .net dependency-injection mef

使用新的流畅的MEF编程模型,如果我有多个目录:

  1. 我将RegistrationBuilder传递给???
  2. 到哪个目录
  3. 我是否需要将RegistrationBuilder传递给SatisfyImportsOnce来电?
  4. 我使用SatisfyImportsOnceComposeParts中的哪一个? (流利的mef有什么变化吗?)
  5. E.g。这是一个说明我的困惑的例子(见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 个答案:

答案 0 :(得分:1)

  1. 您可以将RegistrationBuilder放到要使用MEF约定的任何目录中。如果只想使用约定模型,则在所有目录中使用它。如果示例代码中的DirectoryCatalog将加载仅包含已归属导出/导入的程序集,则您不需要RegistrationBuilder。请注意,两种模型(属性和争用)都可以共存。因此,您可以将RegistrationBuilder添加到所有目录中,除非可能存在满足规则(使用RegistrationBuilder配置)的类型要在{{1}中使用}。
  2. SatisfyImportsOnce的这种重载是一个谜。从文档(以及快速查看MEF的源代码)看起来您可以使用特定的RegistrationBuilder ad-hoc。实际上,我只是设法将它与后面的代码示例一起使用。
  3. SatisfyImportsOnce禁用重组。查看关于此主题的excellent answer

  4. 使用SatisfyImportsOnce(Object,ReflectionContext)

    的示例
    CompositionContainer