それは複雑です。FindAction は ControllerActionInvoker で呼び出されます。これは、最終的に、ReflectedControllerDescriptor.FindAction を呼び出します。FindAction は、ActionMethodSelector.FindActionMethod を呼び出します。これは、同じ型で RunSelectionFilters を呼び出します。そのメソッドは、首輪から渡されたメソッドのリストを取得し、それらを反復処理して、各メソッドの引数を調べ、要求の値と比較します。これはリクエストが来るとすぐに実行する必要があるため、すべてキャッシュされます。また、拡張できるように設計されているため、説明したレイヤーの間にいくつかの抽象型があります。したがって、最初は従うのが少し難しいかもしれません。また、コントローラー以外のロジックに再利用するのはおそらく難しいでしょう。ただし、独自のシステムを実装するためのモデルとして使用できます。だと思います』ドメイン固有のアプリケーションには少し複雑すぎます。拡張ポイントの数は、MVC フレームワークにはおそらく適切ですが、独自のコード YAGNI.
ただし、これで十分に開始できることを願っています。
Web スタックなしでモデル バインダーを使用する場合: MVC は必要ですが、必ずしも Web サーバーは必要ありません。単体テストでそれを行う方法は次のとおりです。
internal static T Bind<T>(string prefix, FormCollection collection, ModelStateDictionary modelState) where T:BaseTimeRecordPresentationModel
{
var mbc = new ModelBindingContext()
{
ModelName = prefix,
ModelState = modelState,
ModelType = typeof(T),
ValueProvider = collection.ToValueProvider()
};
IModelBinder binder = new TimeRecordModelBinder();
var cc = new ControllerContext();
return binder.BindModel(cc, mbc) as T;
}
internal static T BindAndAssertValid<T>(string prefix, FormCollection collection) where T:BaseTimeRecordPresentationModel
{
var msd = new ModelStateDictionary();
var result = Bind<T>(prefix, collection, msd);
if (!msd.IsValid)
{
Assert.Fail(ModelStateValidationSummary(msd));
}
return result;
}