如何将域模型一般映射到表示模型?

时间:2011-08-13 19:26:21

标签: mapping domain-model presentation-model

我试图弄清楚如何将域模型一般地映射到表示模型。例如,给定以下简单对象和接口......

// 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; }
}

我希望能够编写这样的代码......

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

...其中“MapperObject”可以自动找出哪些属性映射到两个对象以及它使用反射,基于约定的映射等映射的对象类型。所以,我可以就像轻松尝试使用相同的MapperObject映射UserPresentationModel和User等对象。

这可能吗?如果是这样,怎么样?

编辑:为了清楚起见,这里是我目前正在使用的非通用MapperObject的示例:

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;
    }
}

我仍在尝试研究如何使用List而不是单个产品,但这是一个不同的主题:)

1 个答案:

答案 0 :(得分:1)

我看到你想要的。您希望将域实体(产品)映射到一种DTO对象(ProductPresentationModel),以便与客户进行通信(GUI,外部服务等)。

我已经将您正在寻找的所有这些功能打包到AutoMapper框架中。

你可以用AutoMapper这样写: Mapper.CreateMap();

查看此维基https://github.com/AutoMapper/AutoMapper/wiki/Flattening

祝你好运。 /最好的问候Magnus