Как сделать контроллеры небольшими в 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;
}

это поднимает вопрос о том, действительно ли модели представления должны быть в веб-проекте, как правило, или они могут быть частью предметной области или какого-либо другого проекта.

Я не уверен, что могу что-то сделать с действием предварительного просмотра, кроме, возможно, использования PreviewModel, который получает ссылку и усекает описание, но это сэкономит две строки.

Преобразователь модели, вероятно, должен быть где-то еще, но я понятия не имею, где это должно быть.

Еще один момент, который приходит на ум, заключается в том, что если я должен разделить этот контроллер с помощью ключевого слова partial(, является ли плохой практикой использовать это для чего-то другого, кроме автоматически сгенерированных классов? )или добавление маршрутов, которые используют разные контроллеры в зависимости от того, какое действие запрашивается или какой метод http используется, как обычно это делается?

10
задан bevacqua 31 July 2012 в 20:23
поделиться