C# 何时将RegistrationBuilder传递到Catalog?
使用新的fluent MEF编程模型,如果我有多个目录: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
RegistrationBuilder
传递到哪个目录RegistrationBuilder
传递到SatisfyiImportsonce
调用吗满足导入
或组件
?(在fluent mef中有什么变化吗?)//获取预连线注册生成器
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);
}
}