Ich habe eine ziemlich gut gestaltete Architektur, in der Controller zu Diensten gehen, die auf Repositories zugreifen, die mit der Datenbank kommunizieren.Wie halten Sie Controller in ASP.NET MVC klein?
Als solche Logik in Controller auf einem Minimum gehalten, aber ich habe noch sehr subtile Stücke von Code, der wie einige Aufgaben ausführen
- bestätigen das Modell
- die Aktionsmethode Argumente ordnen
- rufen Sie einen Service mit diesen Argumenten auf, validieren Sie vielleicht das Ergebnis und geben Sie die Ansicht zurück, wenn das Modell jetzt
- ist, schließlich ein Modell aus dem Ergebnis des Dienstes erzeugt und das zurückgibt.
einige längere Fälle unterscheiden sich je nach Status, der vom Dienst zurückgegeben wird.
hier ein paar Beispiele:
[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);
}
}
und (Post
von Domain kommt, PostModel
ist der Ansicht Modell)
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;
}
stellt sich die Frage nach, ob Ansicht Modelle wirklich in der sein sollte, Webprojekt in der Regel, oder sie könnten tatsächlich Teil der Domäne oder eines anderen Projekts sein.
Ich bin mir nicht sicher, kann ich viel über die Vorschau Aktion, außer vielleicht ein PreviewModel, das den Link erhält, und schneidet die Beschreibung, aber das würde wie zwei Zeilen speichern.
Der Modellkonverter sollte wahrscheinlich woanders sein, aber ich weiß nicht, wo das sein sollte. Ein weiterer Punkt, der mir in den Sinn kommt, ist, ob ich diesen Controller unter Verwendung des Schlüsselwortes partial
spalten sollte (ist es eine schlechte Übung, dies für etwas anderes als automatisch generierte Klassen zu verwenden?), Oder Routen hinzuzufügen, die unterschiedliche Controller verwenden Welche Aktion wird angefordert oder welche http-Methode wird verwendet, wie geht das normalerweise?
Nur eine persönliche Vorliebe, aber Sie können Switch-Anweisungen anstelle von wenn .. sonst verwenden, wenn ... usw. –