0

IStartupから解決する必要があるインターフェイスの複数の実装がありますCompositionContainer。一部の実装には、[ImportingConstructor]インポートが別の DLL によって満たされる があります。

container.GetExports<IStartup>()解決可能なすべての実装を返し、そうでないものをスキップするときのデフォルトの動作のようですIStartup(ほとんどのコンテナーがこのように機能することを理解しています)。したがって、開発者がアセンブリを参照するのを忘れた場合、プログラムは何も問題がないように実行されます。

どうすればこの状態を検出できますか? その場合は例外をスローしたいと思います。

4

1 に答える 1

0

1 つの方法は、構成中にデフォルト値を許可することです。これにより、パーツの作成が可能になり、コンストラクターでインポートされたパーツの値がチェックインされます。指定されたタイプのデフォルトである場合は、例外をスローします。サンプルは次のとおりです。

[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);
    }
}

もう 1 つの方法は、Mefxを使用して障害を診断することです。Mefxを呼び出すスクリプトを作成し、特定のエラーの出力を確認できます。CIを適用している場合は、これも追加できます。

最後になりましたが、Mefx のソースをダウンロードして、Mefx がどのように障害を診断するかを調べて調べることができます。次に、同様のことを試すことができます。MEF Preview 9のソースでは、Samples/CompositionDiagnostics の下にあります。私はこれをやったことがないので、このアプローチについて具体的なことを提案することはできません.

于 2013-10-25T10:11:02.583 に答える