c# – 我什么时候将RegistrationBuilder传递给目录?
发布时间:2020-12-15 21:53:25 所属栏目:百科 来源:网络整理
导读:使用新的流畅的MEF编程模型,如果我有多个目录: 我将RegistrationBuilder传递给哪个目录? 我是否需要将RegistrationBuilder传递给SatisfyImportsOnce电话? 我使用哪种SatisfyImportsOnce或ComposeParts? (流利的mef有什么改变吗?) 例如.这是一个说明我的
使用新的流畅的MEF编程模型,如果我有多个目录:
>我将RegistrationBuilder传递给哪个目录? 例如.这是一个说明我的困惑的例子(见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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |