Introduction The following details concepts that have been adopted on the site I’m currently working on. This was born out of a discussion that took place among the devteam at the time. Differences in phraseology and meaning were ironed out to come up the following definitions and responsibilities.

Queries(GET)/Commands(POST)

  • Contain all the information required to perform an action.
  • Data should be bound onto the query before it hits the controller action.
  • They are POCO and contain no logic.

Controllers

  • Marshall request to handlers and mappers
  • Creates the view model from the handler result

Handler

  • Process queries/commands
  • returns various types (Model/Entity/API DTO)

View Models

  • Contains data that you are using in the view, should not expose anything other than view models/value types.

View

  • Stuff you show the user, should only contain logic that is required to get the stuff displaying correctly.

Wrappers

  • Wrap calls to external api

Services

  • Do things that aren’t simple, pull together bits and bobs and package them up. Take care of business logic that have cross cutting concerns.

Mappers

  • Mappers simply convert one object to another. They DO NOT perform any other logic.

Charts Example from http://www.7digital.com/b/charts

ArtistChartController

  • Takes the query from the web request (which has been bound in the pipeline)
  • Passes the query to a handler
  • Maps response from handler to view model using auto mapper

ArtistChartQueryHandler

  • Takes the query
  • Does some work to get some configuration options
  • Builds up the query further to execute against the API wrapper
  • Returns API DTO

Api Wrapper

  • Takes query
  • Executes against external API
  • Parses responses and maps into API DTO object