微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 我什么时候将RegistrationBuilder传递给目录?

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

>我将RegistrationBuilder传递给哪个目录?
>我是否需要将RegistrationBuilder传递给SatisfyImportsOnce电话?
>我使用哪种SatisfyImportsOnce或ComposeParts? (流利的mef有什么改变吗?)

例如.这是一个说明我的困惑的例子(见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?

解决方法

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

使用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);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐