MVC コントローラーのサイズを縮小しようとして、多くのロジックをサービスにリファクタリングしています (ただし、モデルにファクタリングされている場合は、これと同じ問題が発生します)。次のように、ユーザーに表示したい情報を直接設定ViewData
したり、情報を使用したりすることがよくあります。TempData
var repoUser = new UserRepository();
var foundUser = repoUser.GetUser(userId);
if (foundUser == null) {
ViewData["ErrorMessage"] = "Could not find user with ID {0}.".FormatWith(userId);
return View("UsersRegister");
}
もちろん、サービス クラスに移行するとすぐにViewData
、 、 、およびやTempData
などのメソッドに直接アクセスできなくなるため、これを処理するためのベスト プラクティスを見つけようとしています。2 つの解決策が思い浮かびます。View()
RedirectToAction()
次のような、サービスから返されるコントローラーの動作に関するさまざまな情報を含むクラスを作成します。
public class ResponseInfo { public string Name { get; set; } public bool DoRedirect { get; set; } public object RedirectRouteValues { get; set; } public string InfoMessage { get; set; } public string ErrorMessage { get; set; } }
ViewData
サービス メソッドがや などに直接アクセスできるようにしてみてくださいTempData
。public ActionResult ToggleUserAttended(int eventId, int userId, HttpRequestBase request, TempDataDictionary tempData, ViewDataDictionary viewData, Func<string, object, ActionResult> redirectAction) { //... var repoUser = new UserRepository(); var foundUser = repoUser.GetUser(userId); if (foundUser == null) { tempData["ErrorMessage"] = "Could not find user with ID {0}.".FormatWith(userId); return redirectAction("UsersRegister", new { id = eventId, returnUrl = request.QueryString["returnUrl"] }); } //... }
...そしてコントローラで:
return _svcEvent.ToggleUserAttended(123, 234, Request, TempData, ViewData, (name, routeVals) => RedirectToAction(name, routeVals));
ResponseInfo
番号 1 の場合、コントローラーは、オブジェクトを見て、リダイレクトするかどうか、ビューを表示するかどうか、エラーまたは情報メッセージをTempData
orにプラグインするかどうかなどを決定するために、より多くのロジックを実行する必要がありますViewData
。番号 2 は、ワンライナー コントローラーをほとんど許可します。ただし、サービスにコントローラー固有のものを非常に認識させています。ただし、とにかくサービスは常にコントローラーと密接に結びついているので、これは問題ですか? 1つまたは2つがベストプラクティスでしょうか、それともリストにないものでしょうか?