2011-01-26 4 views
3

.NET MVC 2アプリケーション内でStructurMap(2.6.1にアップグレード)とJimmy Bogard's Smart Model Bindersを使用しています。私もadapting a technique by Dominic Pettiferです。スマートモデルのバインダーを使用して、選択リストを再投入する必要のあるポストバックシナリオのビューモデルにDIを挿入することができます。StructureMapとNET MVC 2を使用したTryGetInstanceの問題

StructureMapについてはほとんど分かりませんが、私が得た問題の1つは、パラメータのないコンストラクタによるviewModelバインディングのstructuremap 202 no instance defined errorでした。

私のIOCMOdelBinder classでは、GetInstance()の代わりにTryGetInstance()を使用しようとしています。前者は、modelTypeと一致しない場合はnullを返します。基本的に、登録済みのインスタンスが見つからない場合は、デフォルトのモデルバインダーに戻ります。

マイオーバーライドCreateModelクラスは次のようになります。

protected override object CreateModel(ControllerContext controllerContext, 
ModelBindingContext bindingContext, Type modelType) 
{ 

    var myInstance = ObjectFactory.TryGetInstance(modelType); 

    if (myInstance != null) 
    { 
    return myInstance; 
    } 
    else 
    { 
    return base.CreateModel(controllerContext, bindingContext, modelType); 
    } 
} 

私は、彼らが同じように動作するように期待されるラインObjectFactory.GetInstance(modelType);を取り出したが、TryGetInstance戻りヌルとGetInstanceそれがで間違いなくあるように、正しいオブジェクトのOKを返します。レジストリ。私はGetInstanceを使うことができますが、もう少しエレガントですtryキャッチでそれをラップする必要があります!何か提案してください?

答えて

10

TryGetInstanceは、「コンテナが型について知っている場合はそれを返し、それ以外の場合はnullを返します」を意味します。何らかの理由で爆発した場合は、コンテナから型を要求し、nullを返します。

最も混乱を招く原因は、具体的なタイプを最初に登録しなくても解決できることです。これは非常に素晴らしい機能です。なぜなら、StructureMapで依存関係を解決したい場合は、すべての具体的な型を登録する必要がないからです。ただし、コンクリートタイプを事前登録する必要がないため、コンテナには設定がないため、コンテナは「それらについて知っていません」。そのため、TryGetInstanceが具体的な型を認識しているかどうかを調べるときにTryGetInstanceがチェックしていないと判断し、nullを返します。しかし、単純にGetInstanceを実行するだけであれば、型について知っているかどうかを確認することさえしません。それはコンクリートとして認識し、ビルドします。

0

TryGetInstanceはobsulatedで、もう存在しません。

関連する問題