Question

I am trying to figure out how to generically map a domain model to a presentation model. For example, given the following simple objects and interfaces ...

// Product
public class Product : IProduct
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

public interface IProduct
{
    int ProductID { get; set; }
    string ProductName { get; set; }
}

// ProductPresentationModel
public class ProductPresentationModel : IProductPresentationModel
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public bool DisplayOrHide { get; set; }
}

public interface IProductPresentationModel
{
    int ProductID { get; set; }
    string ProductName { get; set; }
    bool DisplayOrHide { get; set; }
}

I would like to be able to write code like this ...

MapperObject mapper = new MapperObject();
ProductService service = new ProductService();
ProductPresentationModel model = mapper.Map(service.GetProductByID(productID));

... in which the "MapperObject" could automatically figure out which properties map across the two objects and what sort of objects it is mapping using something like reflection, convention-based mapping, etc. So, I could then just as easily try to map objects like UserPresentationModel and User with the same MapperObject.

Is this possible? If so, how?

EDIT: Just for clarity, here is an example of a non-generic MapperObject that I am currently using:

public class ProductMapper
{
    public ProductPresentationModel Map(Product product)
    {
        var presentationModel = new ProductPresentationModel(new ProductModel())
                                {
                                    ProductID = product.ProductID,
                                    ProductName = product.ProductName,
                                    ProductDescription = product.ProductDescription,
                                    PricePerMonth = product.PricePerMonth,
                                    ProductCategory = product.ProductCategory,
                                    ProductImagePath = product.ProductImagePath,
                                    ProductActive = product.ProductActive
                                };

        return presentationModel;
    }
}

I am still trying to work out how to get this to work with List, instead of just a single Product, but that's a different topic :)

Was it helpful?

Solution

I see want you want. You want to map your domain entities (Product) to aome kind of DTO object (ProductPresentationModel) for communication with your clients (GUI, external services etc).

I you have all this functionality you're looking for packed into AutoMapper framework.

You can write like this with AutoMapper: Mapper.CreateMap();

look at this wiki https://github.com/AutoMapper/AutoMapper/wiki/Flattening

Good luck. /Best Regards Magnus

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top