Microsoft.Composition。 WithDefaultConventions方法有什么作用?

时间:2014-09-16 13:43:21

标签: c# dependency-injection composition mef2

假设我有一个方法GetAssemblies,它返回一个程序集列表,一个名为GetConventions的方法,它返回一个ConventionBuilder,我可能会像这样编写我的容器:

CompositionHost container =
    new ContainerConfiguration()
        .WithAssemblies(
            GetAssemblies(), 
            GetConventions())
        .CreateContainer();

但我也可能这样写:

CompositionHost container =
    new ContainerConfiguration()
        .WithAssemblies(GetAssemblies())
        .WithDefaultConventions(GetConventions())
    .CreateContainer();

问题:这两种方式之间有什么区别?

WithDefaultConventions中的“默认”一词正在抛弃我。 MSDN对这意味着什么没有太多了解。如果该方法简称为WithConventions,我就不会再考虑它了。


以下示例方法。

GetAssemblies:

private static IEnumerable<Assembly> GetAssemblies()
    {
        return new[]
        {
            typeof(FileQueue).Assembly, 
            typeof(LoggerExport).Assembly, 
        };
    }

GetConventions:

private static ConventionBuilder GetConventions()
    {
        var conventionBuilder = new ConventionBuilder();

        conventionBuilder
            .ForType<OmsDbContext>()
            .Export<OmsDbContext>()
            .SelectConstructor(ctorInfos => ctorInfos.First())
            .Shared("Boundary.UnitOfWork");

        return conventionBuilder;
    }

1 个答案:

答案 0 :(得分:0)

在你的例子中,这两件事情应该是一样的。但是,如果您多次调用WithAssemblies,则只能调用WithDefaultConventions()一次,以将这些约定应用于所有这些调用的程序集。否则,您必须每次都提供约定作为WithAssemblies()方法的第二个参数来实现相同的效果。

太糟糕了,你在微软自己的Microsoft.Composition包中找不到太多信息。