私は、コントローラーがデータベースと通信するリポジトリーにアクセスするサービスにアクセスする、非常によく設計されたアーキテクチャーを持っています。
そのため、コントローラーのロジックは最小限に抑えられていますが、次のようないくつかのタスクを実行する非常に微妙なコードがまだあります。
- モデルを検証する
- アクションメソッドの引数を配置します
- これらの引数を使用してサービスを呼び出し、結果を検証して、モデルが無効になった場合はビューを返す可能性があります
- 最後に、サービスの結果からモデルを作成し、それを返します。
いくつかのより長いケースは、サービスによって返される「ステータス」に応じて異なることを行います。
ここにいくつかの例があります:
[HttpPost]
[AjaxOnly]
[Authorize]
public JsonResult Preview(string input)
{
LinkResult parsed = linkService.ParseUserInput(input);
if (parsed.Result == LinkParseResult.Used)
{
long? postId = parsed.Link.PostId;
if (postId.HasValue)
{
Post post = postService.GetById(postId.Value, false);
return Json(new
{
faulted = "used",
link = DetailsRoute(post),
id = postId
});
}
else
{
return Json(new { faulted = "invalid" });
}
}
else if (parsed.Result == LinkParseResult.Invalid)
{
return Json(new { faulted = "invalid" });
}
else
{
Link link = parsed.Link;
if (link.Description != null && link.Description.Length > 200)
{
link.Description = link.Description.Substring(0, 200);
}
return AjaxView(link);
}
}
および(Post
ドメインに由来しPostModel
、ビューモデルです)
private PostModel PostModelConverter(Post post)
{
Link link = post.Link;
if (link == null)
{
throw new ArgumentException("post.Link can't be null");
}
if (link.Type == LinkType.Html)
{
return new PostedLinkModel
{
Description = link.Description,
PictureUrl = link.Picture,
PostId = post.Id,
PostSlug = postService.GetTitleSlug(post),
Timestamp = post.Created,
Title = link.Title,
UserMessage = post.UserMessage,
UserDisplayName = post.User.DisplayName
};
}
else if (link.Type == LinkType.Image)
{
return new PostedImageModel
{
PictureUrl = link.Picture,
PostId = post.Id,
PostSlug = postService.GetTitleSlug(post),
Timestamp = post.Created,
UserMessage = post.UserMessage,
UserDisplayName = post.User.DisplayName
};
}
return null;
}
これにより、ビューモデルが実際にWebプロジェクトに含まれるべきか、それとも実際にドメインまたは他のプロジェクトの一部である可能性があるかについての疑問が生じます。
リンクを受け取り、説明を切り捨てるPreviewModelを使用する以外に、プレビューアクションについて多くのことができるかどうかはわかりませんが、2行節約できます。
モデルコンバーターはおそらくどこかにあるはずですが、それがどこにあるべきかについては私にはわかりません。
頭に浮かぶもう1つのポイントは、partial
キーワードを使用してこのコントローラーを分割するか(自動生成されたクラス以外の目的でこれを使用するのは悪い習慣ですか?)、要求されたアクションに応じて異なるコントローラーを使用するルートを追加するかどうかです。どのhttpメソッドが使用されていますか、それを処理する通常の方法は何ですか?