我有一个接口IStartup
的多个实现,我需要从CompositionContainer
解析。某些实现具有[ImportingConstructor]
,其导入由另一个DLL满足。
似乎我container.GetExports<IStartup>()
时的默认行为将返回所有可解析的IStartup
实现,并跳过那些不可解析的实现(我知道大多数容器以这种方式工作)。因此,如果开发人员忘记引用程序集,程序就会运行,就像没有错。
我怎样才能发现这种情况?如果是这种情况,我想抛出异常。
答案 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下找到它。我从来没有这样做过,所以我不能就这种方法提出具体的建议。