使用新的流畅的MEF编程模型,如果我有多个目录:
>我将RegistrationBuilder传递给哪个目录?
>我是否需要将RegistrationBuilder传递给SatisfyImportsOnce电话?
>我使用哪种SatisfyImportsOnce或ComposeParts? (流利的mef有什么改变吗?)
// 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的这个超载是一个谜.从文档(以及快速查看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] 举报,一经查实,本站将立刻删除。