2012-05-11 6 views
4

私は、AutoMapperをセットアップして、Ninject経由ですべてのオブジェクトをインスタンス化しようとしていました。 私は NinjectのあるAutoMacpper

Mapper.Configuration.ConstructServicesUsing(x => kernel.Get(x)); 

私のGlobal.asaxファイルに次のコードを持っている一例として、私は次のようなマッピング

Mapper.CreateMap<TestModel, IndexViewModel>(); 

を持っているが、これは動作して表示されません。私は、 'IndexViewModel'にデフォルトのコンストラクタがないというエラーが発生します。

マッピングでninjectを使用するようにautomapperに明示的に指示することで、マッパーを動作させることができます。

Mapper.CreateMap<TestModel, IndexViewModel>().ConstructUsingServiceLocator(); 

しかし、すべての単一マッピングでこれを行う必要はありません。何か不足していますか?

+0

あなたはIndexViewModelソースを供給していません。それはデフォルトのコンストラクタを持っていますか? –

+0

@Peterいいえデフォルトのコンストラクタはありません。 AutoMapperを1つ追加すると、問題なくIndexViewModelが作成されますが、Ninjectを使用しても問題は発生しません。 – WDuffy

+5

ビューモデルにデフォルトのコンストラクタがないのはなぜですか?なぜ彼らはNinjectによって管理される必要がありますか?デフォルトのコンストラクタを使用しないでモデルを表示すると、多くの頭痛を引き起こします。これらのビュー・モデルをアクション引数として取るPOSTコントローラ・アクションはどうでしょうか?あなたはそれらのためのカスタムモデルのバインダーを書く必要があります。複雑に見えます。 –

答えて

1

ちょうどあなたの初期化コードのどこかにあなたのためにこれを行うには関数を作成

void CreateMapWithServiceLocator<T1,T2>() 
{ 
    Mapper.CreateMap<T1,T2>().ConstructUsingServiceLocator(); 
}