Как в общем случае сопоставить модель предметной области с моделью представления?

Я пытаюсь выяснить, как в общем случае сопоставить модель предметной области с моделью представления. Например, с учетом следующих простых объектов и интерфейсов...

// 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" может автоматически выяснить, какие свойства отображаются между двумя объектами и какие объекты он отображает, используя что-то вроде отражения, сопоставления на основе соглашений и т. д. Итак, я мог бы тогда так же легко попытаться сопоставлять объекты, такие как UserPresentationModel и User, с одним и тем же MapperObject.

Это возможно? Если так, то как?

РЕДАКТИРОВАТЬ: просто для ясности, вот пример не универсального 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;
    }
}

Я все еще пытаюсь понять, как заставить это работать со списком, а не с одним продуктом, но это уже другая тема:)

1 ответ

Решение

Я вижу, что ты хочешь. Вы хотите сопоставить свои доменные сущности (Product) с некоторыми объектами DTO (ProductPresentationModel) для связи с вашими клиентами (GUI, внешние службы и т. Д.).

Если у вас есть все эти функции, которые вы ищете, упакованы в AutoMapper Framework.

Вы можете написать так с AutoMapper: Mapper.CreateMap();

посмотрите на эту вики https://github.com/AutoMapper/AutoMapper/wiki/Flattening

Удачи. / С наилучшими пожеланиями Магнус

Другие вопросы по тегам