4

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

  1. 我要传递到哪个目录RegistrationBuilder???
  2. 我需要通过RegistrationBuilder调用SatisfyImportsOnce吗?
  3. 我使用哪个SatisfyImportsOnce或哪个?ComposeParts(在流利的mef中有什么改变吗?)

例如,这是一个说明我的困惑的示例(请参阅 rhs 上的评论):

// 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?
4

1 回答 1

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

使用 SatisfyImportsOnce(Object, 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);
    }
}
于 2013-07-17T15:14:27.163 回答