コンピュータサイエンスでは、それぞれの方法が1つのことと1つのことだけを行うべきであると教えてきました。私たちは、次のgiven as examples of good practiceのようなMVCのアクションを見ること、その後少し混乱しています:Asp.Net MVCアクション - 懸念の分離/単一の責任原則
[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Edit(int id, FormCollection collection) {
Dinner dinner = dinnerRepository.GetDinner(id);
if (!dinner.IsHostedBy(User.Identity.Name))
return View("InvalidOwner");
try {
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch {
ModelState.AddModelErrors(dinner.GetRuleViolations());
return View(new DinnerFormViewModel(dinner));
}
}
基本的にコードのこの作品は、多くの機能を提供します。
- はアクションにアクセスする方法を定義します - 投稿のみ
- アクションにアクセスできるユーザーを定義します - (User.Ident - dinnerRepository
- は、状態情報にアクセス -
- が永続化メカニズムにアクセス認可ity.Name)
- は強く、オブジェクトを入力してNameValueCollectionのに変換 - のUpdateModel()
- 指定3可能ActionResultsし、それぞれのコンテンツ - InvalidOwner /詳細/編集ビュー
は、私にはこれがためにあまりにも多くの責任のように思えます1つの方法。またのような一般的なシナリオを扱っていない、すなわち、かなり単純なアクションです:
- は、ビジネスルールを確認する -
- ナビゲーションパスを「ユーザの入力を信用しない」 - 成功するには、常に「詳細」 に戻ります保存
- 戻り値の型が異なる - 誰かがグリッドから「編集」を呼び出してJsonResultが必要ですか?
- エラー処理の改善 - データベースはGetDinner中にアクセスできない場合(ID)
- 追加のビューデータを構築YSOD - ドロップ用SelectListsダウンリスト
があまりにもこの単一の方法を中心に必要なテストの量を言及していませんすなわち、FormCollection/UserIdentity/Authorization Provider/Repository/etcのためのmocking/fakingです。
私の質問は、私たちのコントローラーのアクションに多大な影響を与えるのを避けるにはどうすればよいですか?
私は"opinions"が特に "サンダードームの原則"という大きなコンセプトだと思う傾向があります。私はFubuMVCの建物に関わる人たちとその理由について大いに尊敬していますが、私は今すぐ使えるものが必要です。
編集 - 私はこのような何かをしていたようだ - Opinionated Controller。私はそれをMVCプレビュー5のためにさらに検討する必要があります。私はそれを自分で更新する必要があるかもしれません。
非常に良い質問! –