GetExports和检测不是所有进口都可以满足

时间:2013-10-23 00:02:21

标签: mef

我有一个接口IStartup的多个实现,我需要从CompositionContainer解析。某些实现具有[ImportingConstructor],其导入由另一个DLL满足。

似乎我container.GetExports<IStartup>()时的默认行为将返回所有可解析的IStartup实现,并跳过那些不可解析的实现(我知道大多数容器以这种方式工作)。因此,如果开发人员忘记引用程序集,程序就会运行,就像没有错。

我怎样才能发现这种情况?如果是这种情况,我想抛出异常。

1 个答案:

答案 0 :(得分:0)

一种方法是在合成期间允许默认值,这将允许创建零件,然后在构造函数中检查导入零件的值。如果它是给定类型的默认值,则抛出异常。这是一个示例:

[Export(typeof(IStartup))]
public class StartUpThatDoesNotResolve : IStartup
{
    private SomeDependency _sd;

    [ImportingConstructor]
    public StartUpThatDoesNotResolve([Import(AllowDefault=true)] SomeDependency sd)
    {
        if (Object.Equals(sd, default(SomeDependency))) throw new ArgumentException("sd");

        _sd = sd;
    }

    public void Start()
    {
        Console.WriteLine("{0} started", this.GetType().Name);
    }
}

另一种方法是使用Mefx来诊断故障。您可以编写一个调用 Mefx 的脚本,并检查输出是否存在特定故障。如果您申请CI,您也可以添加此内容。

最后但并非最不重要的是,您可以下载Mefx的来源并研究并查看他们如何诊断失败。然后你可以尝试类似的东西。在MEF Preview 9的源代码中,您可以在Samples / CompositionDiagnostics下找到它。我从来没有这样做过,所以我不能就这种方法提出具体的建议。