Search code examples
c#asp.net-mvcviewmodelddd-repositoriesaggregateroot

ASP.NET MVC: what mechanic returns ViewModel objects?


As I understand it, Domain Models are classes that only describe the data (aggregate roots). They are POCOs and do not reference outside libraries (nothing special).

View models on the other hand are classes that contain domain model objects as well as all the interface specific objects like SelectList. A ViewModel includes using System.Web.Mvc;.

A repository pulls data out of a database and feeds them to us through domain model objects. What mechanic or device creates the view model objects, populating them from a database? Would it be a factory that has database access? Would you bleed the view specific classes like System.Web.Mvc in to the Repository? Something else?

For example, if you have a drop down list of cities, you would reference a SelectList object in the root of your View Model object, right next to your DomainModel reference:

public class CustomerForm {
    public CustomerAddress address {get;set;}
    public SelectList cities {get;set;}
}

The cities should come from a database and be in the form of a select list object. The hope is that you don't create a special Repository method to extract out just the distinct cities, then create a redundant second SelectList object only so you have the right data types.


Solution

  • AutoMapper could be used to convert your models to view-models. Here's a very nice article of how you could use it in your ASP.NET MVC application.

    Basically your controller action might look like this:

    [AutoMap(typeof(ProductModel), typeof(ProductViewModel))]
    public ActionResult Index(int id)
    {
        return View(_repository.GetById(id));
    }
    

    So you still work with your domain models in the controller and the AutoMap action filter will use AutoMapper to convert the model to a view-model according to a mapping file and pass it to the view.