加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:53:25 所属栏目:百科 来源:网络整理
导读:使用新的流畅的MEF编程模型,如果我有多个目录: 我将RegistrationBuilder传递给哪个目录? 我是否需要将RegistrationBuilder传递给SatisfyImportsOnce电话? 我使用哪种SatisfyImportsOnce或ComposeParts? (流利的mef有什么改变吗?) 例如.这是一个说明我的
使用新的流畅的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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读