我有一個設計得非常好的架構,其中控制器轉到訪問與數據庫通信的存儲庫的服務。如何保持ASP.NET MVC中的控制器小?
這樣,在控制器邏輯被保持在最小,但我仍然有代碼非常微妙件執行一些任務,如
- 驗證模型
- 安排的動作方法參數
- 用這些參數調用一些服務,也許驗證結果並返回視圖如果模型是現在無效
- 最後從服務的結果產生一個模型,並返回該模型。
根據服務返回的「狀態」,一些較長的情況會做不同的事情。
這裏有幾個例子:
[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項目作爲一項規則,或者他們實際上可能是域或其他項目的一部分。
我不確定我可以對預覽操作做很多事情,除了可能使用接收鏈接的預覽模型,並截斷描述,但這樣可以節省兩行。
模型轉換器應該可能在別的地方,但我對於應該在哪裏卻一無所知。
想到的另一點是,如果我應該使用關鍵字partial
來分割此控制器(將其用於除自動生成的類之外的其他項目是否是一種不好的做法?),或者添加使用不同控制器的路由,具體取決於請求什麼操作或者使用了什麼http方法,處理這個問題的常用方法是什麼?
只是個人喜好,但你可以使用switch語句而不是if .. else if ...等等。 – 2012-07-31 20:50:22