Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where is the best place to map from view model to domain model?

Where is the best place to do mappings from view model to domain model? By mappings I mean from my EditGrantApplicationViewModel to a GrantApplication object.

Lets say that I have the following action method (partial code):

[HttpPost]
public ActionResult Create(EditGrantApplicationViewModel editGrantApplicationViewModel)
{
   if (!ModelState.IsValid)
   {
      return View("Create", editGrantApplicationViewModel);
   }

   return View("Index");
}

Do I need to pass editGrantApplicationViewModel to a service layer method and do the mappings in the method?

like image 408
Brendan Vogt Avatar asked Apr 10 '11 09:04

Brendan Vogt


1 Answers

You should not place any of your mapping logic inside the service layer since it simply dosent belong there. The mapping logic should go inside your controller and nowhere else.

Why you might ask? Simple enough, by placing the mapping logic in your service layer, it needs to know about the ViewModels which the service layer NEVER EVER should be aware of - also it reduces the flexibility of the app that you place the mapping logic in there since you cant reuse the service layer without a lot of hacks.

Instead you should do something like:

// Web layer (Controller)
public ActionResult Add(AddPersonViewModel viewModel)
{
    service.AddPerson(viewModel.FirstName, viewModel.LastName)
    // some other stuff...
}

// Service layer
public void AddPerson(string firstName, string lastName)
{
    var person = new Person { FirstName = firstName, LastName = lastName };
    // some other stuff...
}

By doing like above, you make your service layer more flexible since it's not bound to a particular class and it's not aware of the existence of your viewmodel.

UPDATE:

To map your Entities returned from the service layer to ViewModels, you might want to take a look at Automapper or Value Injecter.

like image 103
ebb Avatar answered Oct 07 '22 00:10

ebb