У меня есть довольно хорошо спроектированная архитектура, в которой контроллеры обращаются к службам, которые обращаются к репозиториям, которые взаимодействуют с базой данных.
Таким образом, логика в контроллерах сведена к минимуму, но у меня все еще есть очень тонкие фрагменты кода, которые выполняют некоторые задачи, такие как
некоторые более длинные случаи делают разные вещи в зависимости от «статуса», возвращаемого службой.
вот пара примеров:
[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;
}
это поднимает вопрос о том, действительно ли модели представления должны быть в веб-проекте, как правило, или они могут быть частью предметной области или какого-либо другого проекта.
Я не уверен, что могу что-то сделать с действием предварительного просмотра, кроме, возможно, использования PreviewModel, который получает ссылку и усекает описание, но это сэкономит две строки.
Преобразователь модели, вероятно, должен быть где-то еще, но я понятия не имею, где это должно быть.
Еще один момент, который приходит на ум, заключается в том, что если я должен разделить этот контроллер с помощью ключевого слова partial
(, является ли плохой практикой использовать это для чего-то другого, кроме автоматически сгенерированных классов? )или добавление маршрутов, которые используют разные контроллеры в зависимости от того, какое действие запрашивается или какой метод http используется, как обычно это делается?