C# 何时将RegistrationBuilder传递到Catalog?

C# 何时将RegistrationBuilder传递到Catalog?,c#,.net,dependency-injection,mef,C#,.net,Dependency Injection,Mef,使用新的fluent MEF编程模型,如果我有多个目录: 我应该将我的RegistrationBuilder传递到哪个目录 我需要将RegistrationBuilder传递到SatisfyiImportsonce调用吗 我应该使用哪种满足导入或组件?(在fluent mef中有什么变化吗?) 例如,这里有一个例子来说明我的困惑(参见对r.h.s.的评论): //获取预连线注册生成器 RegistrationBuilder rb=新的MefCompositionRoot().CommonRegi

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

  • 我应该将我的
    RegistrationBuilder
    传递到哪个目录
  • 我需要将
    RegistrationBuilder
    传递到
    SatisfyiImportsonce
    调用吗
  • 我应该使用哪种
    满足导入
    组件
    ?(在fluent mef中有什么变化吗?)
  • 例如,这里有一个例子来说明我的困惑(参见对r.h.s.的评论):

    //获取预连线注册生成器
    RegistrationBuilder rb=新的MefCompositionRoot().CommonRegistrationBuilder();
    //注册此WCF服务类
    rb.ForType().Export();
    var assembly=typeof(LogService).assembly;
    var assemblyCatalog=新的assemblyCatalog(assembly,rb);//
    
  • 您可以将
    RegistrationBuilder
    放入要使用MEF约定的任何目录中。如果只想使用约定模型,请在所有目录中使用它。如果示例代码中的
    DirectoryCatalog
    将加载仅包含属性化导出/导入的程序集,则不需要
    RegistrationBuilder
    。请注意,这两种模型(属性化和冲突)可以共存。因此,您可以将
    RegistrationBuilder
    添加到所有目录中,除非可能有一种类型满足您不希望在
    CompositionContainer
    中使用的规则(使用RegistrationBuilder配置)
  • 这是一个谜。从文档(以及快速查看MEF的源代码)来看,您可以使用特定的RegistrationBuilder。事实上,我只在下面的代码示例中使用了它
  • 禁用重新编译。看看这个主题

  • 使用“满足导入”(对象、ReflectionContext)的示例

    private static void testlater注册\u SameBuilder\u Ok()
    {            
    var rb=新注册生成器();
    var assemblyCatalog=新的assemblyCatalog(typeof(LogService).Assembly,rb);
    使用(var容器=新的CompositionContainer(assemblyCatalog))
    {                
    rb.ForType().Export();
    var server=新类型导入日志服务();
    //使用相同的RegistrationBuilder。
    container.SatisfyImportsOnce(服务器,rb);
    }
    }
    
    // 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?
    
    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);
        }
    }