0

この質問では: IoC コンテナーの例

コンストラクターでスローされた例外は、IoC がそれらを食べるため、デバッグ/処理が難しいことを警告する回答があります。それはもはや真実ではないと言うコメントが続きます。

現在、.Net IoC はこの欠陥をどのように軽減していますか?

少なくとも 2 つの組織 (基本的には作成者だけでなく) で使用されている .Net IoC に興味がありますが、一覧が必要な場合は、Windsor、StructureMap、Autofac、Ninject を参照してください。

4

3 に答える 3

3

明らかに、これは使用している IoC コンテナーに依存します。私の経験では、例外が「飲み込まれる」ことはめったになく、解決時に報告されます。コンストラクターで依存関係を受け入れて検証する以外に何もしないという一般的なベスト プラクティスに従えば、問題はありません。

Unity の例を次に示します。

void Main()
{
    IUnityContainer container = new UnityContainer();
    container.RegisterType<IAnimal, Dog>();

    // Exception thrown on this line
    var x = container.Resolve<IAnimal>();
}

public interface IAnimal
{
}

public class Dog : IAnimal
{
    public Dog()
    {
        throw new Exception();
    }
}

これを報告します(非常に有益だと思います):

ResolutionFailedException: Resolution of the dependency failed, type = "UserQuery+IAnimal", name = "(none)".
Exception occurred while: Calling constructor UserQuery+Dog().
Exception is: Exception - Exception of type 'System.Exception' was thrown.
-----------------------------------------------
At the time of the exception, the container was:

Resolving UserQuery+Dog,(none) (mapped from UserQuery+IAnimal, (none))
Calling constructor UserQuery+Dog()
于 2012-09-10T19:51:33.650 に答える
1

コンストラクターで例外が発生した場合、StructureMap が例外をバブルアップするという事実は知っていますが、このルールには奇妙なニュアンスがいくつかある可能性があります。たとえば、SingletonPattern ディスパッチャを使用していて、割り当てられた Singleton がプログラムの実行の早い段階で静かにクラッシュした場合、StructureMap はクラッシュしたインスタンスを、singleton の型の何かを要求するものに喜んで入力します。その時点で何が起こるかを判断するのは困難です。すべては、プログラムがクラッシュしたインスタンスへのアクセスをどのように処理するかに依存します。

ただし、スローバックされるものの例として、オブジェクトのコンストラクターを無効な引数または型が一致しない引数で呼び出そうとすると、呼び出しが呼び出された時点で説明的なエラーがスローされます。通常、セットアップは正常に機能しますが、基本的な単体テスト (NUnit) を使用して事前にテストできます。

[Test]  
public void Assert_registry_is_valid()  
{  
    ObjectFactory.AssertConfigurationIsValid();  
}  

確かに、StructureMap の飲み込みエラーで問題が発生したことは一度もありません。一般に、有用な情報と完全なスタック トレースを取得するのは非常に簡単です。

于 2012-09-10T19:49:30.450 に答える
1

熱心に依存関係を解決しようとしているときに、Autofac がスローされた例外を「ラップ」することはわかっています。AutofacException の InnerException は、コンストラクターによってコンテナーにスローされた例外になります。そのため、通常は、AutofacExceptions をキャッチして InnerExceptions にドリルダウンすることにより、解決例外を処理します。

ほとんどの IoC には、解決が成功した場合に初期化される出力パラメーターを使用して、真または偽のブール値を適切に返す「TryResolve」のようなメソッドがあります。これらのメソッドは例外を「食べる」ものなので、例外が役に立つ場合は使用しないでください。水和されたコンストラクター注入オブジェクトを生成しようとする基本的な GetInstance または Resolve メソッドへのほとんどすべての呼び出しは、選択されたコンストラクターで発生するすべての例外をスローします。

于 2012-09-10T19:52:12.293 に答える