ASP.NET MVC. Является ли ViewModel подходящим местом для выполнения незначительных вычислений?

Я работаю над UserViewModel, и мне интересно, уместно ли выполнять незначительные вычисления на виртуальной машине или мне нужно отделить ее дальше и вычислить в другом месте.

Public Class UserViewModel
    Public Property UserName As String
    Public Property Email As String
    Public Property Website As String
    Public Property ID As Integer
    Public Property OpenIds As List(Of OpenID)
    Public Property UserAge As String
    Public Property About As String
    Public Property Slug As String
    Public Property LastSeen As String
    Public Property Region As String
    Public Property MemberSince As String
    Public Property Reputation As String
    Public Property isUserMatch As Boolean = False
    Private MarkDownSharp As MarkdownSharp.Markdown

    Public Sub New(ByVal user As User)
        Dim currentuser As Authentication.AuthUserData = Authentication.CustomAuthentication.RetrieveAuthUser
        MarkDownSharp = New MarkdownSharp.Markdown
        With MarkDownSharp
            .AutoHyperlink = False
            .AutoNewLines = True
            .EncodeProblemUrlCharacters = True
            .LinkEmails = True
            .StrictBoldItalic = True
        End With

        _UserName = If(Not user.UserName Is Nothing, user.UserName, "User" & user.ID.ToString)
        _Email = user.Email
        _Website = user.WebSite
        _ID = user.ID
        _OpenIds = user.OpenIDs.ToList
        ''# Converts the users birthdate to an age representation
        ''#      IE: 29
        _UserAge = user.BirthDate.ToAge

        ''# Because some people can be real ass holes and try to submit bad
        ''# data (scripts and shitè) we have to modify the "About" content in
        ''# order to sanitize it.  At the same time, we transform the Markdown
        ''# into valid HTML. The raw input is stored without sanitization in
        ''# the database.  this could mean Javascript injection, etc, so the
        ''# output ALWAYS needs to be sanitized.
        _About = Trim(Utilities.HtmlSanitizer.Sanitize(MarkDownSharp.Transform(user.About)))

        ''# Removes spaces from Usernames in order to properly display the
        ''# username in the address bar
        _Slug = Replace(user.UserName, " ", "-")

        ''# Returns a boolean result if the current logged in user matches the
        ''# details view of the user in question.  This is done so that we can
        ''# show the edit button to logged in users.
        _isUserMatch = If(currentuser.ID = user.ID, True, False)


        ''# Grabs the users registration data and formats it to a time span
        ''# The "timeago-nosuffix" CssClass is there to remove the "ago"
        ''# suffix from the "member for" string. Cuz when you think about
        ''# it... "Member for 5 days ago" just sounds stupid.
        _MemberSince = user.MemberSince.ToTimeSpan("timeago-nosuffix")

        ''# Grabs the users last activity and formats it to a time span
        _LastSeen = user.ActivityLogs.Reverse.FirstOrDefault.ActivityDate.ToTimeSpan("timeago", "ago")

        ''# Formats the users reputation to a comma Deliminated number 
        ''#    IE: 19,000 or 123k
        _Reputation = user.Reputation.ToShortHandNumber


        ''# Get the name of the users current Region.
        _Region = user.Region.Region.FirstOrDefault
    End Sub

End Class

person Chase Florell    schedule 07.11.2010    source источник
comment
На заметку. Я ненавижу, когда люди редактируют теги, не задумываясь. Мой пример находится в VB.NET, НО это не означает, что мой вопрос имеет какое-либо отношение к VB.NET. Вопрос касается принципов, но с добавлением тега VB.NET он не позволит квалифицированным (НЕ VB) людям взглянуть на вопрос. Поэтому ПОЖАЛУЙСТА, во имя всего святого, НЕ редактируйте теги, чтобы включить язык кода, если вопрос не зависит от ответа на конкретном языке !!!   -  person Chase Florell    schedule 08.11.2010


Ответы (2)


Если эти расчеты касаются форматирования для данного представления, то это точное место. Кажется, вы делаете именно это: форматирование для представления, которое в порядке (извините, если я что-то пропустил, мои навыки чтения кода VB.NET начинают ускользать от меня :-)). С другой стороны, если это какая-то доменная логика, она, вероятно, лучше подходит для модели, чтобы ее можно было использовать повторно.

person Darin Dimitrov    schedule 07.11.2010
comment
Большая часть того, что я делаю, это именно... форматирование. Однако в моих событиях ViewModel я также добавляю все свои элементы широты/долготы в переменную, а затем делю на количество записей... таким образом я могу динамически получить центр карты. См. первый блок кода (stackoverflow.com/questions/4115180/) - я переместил этот код в ViewModel. - person Chase Florell; 07.11.2010
comment
@rockin Мне это кажется недостаточно незначительным. - person bzlm; 07.11.2010

Хотя я не согласен с Дарином, есть и другой подход.

Вместо того, чтобы помещать простую логику в свои ViewModels, вы также можете поместить эту логику в любой слой, который вы используете для преобразования объектов модели предметной области в объекты dto или viewmodel. Давайте назовем это вашим картографическим слоем. Это делает ваши модели просмотра действительно простыми и гибкими, сохраняя при этом всю логику преобразования пользовательского представления в отдельном месте.

С помощью такого инструмента, как AutoMapper, это действительно легко сделать.

person John Farrell    schedule 07.11.2010